我有缓存,用 WeakHashMap 实现,像这样:
private static WeakHashMap<Object, WeakReference<Object>> objects = new WeakHashMap<>();
我有一个城市类的实例:
City c = new City();
我现在将此实例添加到我的 map 中,如下所示:
objects.put(c, new WeakReference<Object>(c));
根据 WeakHashMap jvm 实现,如果 key 没有对它的强引用,它就会从映射中删除(在空闲时间)。
因此,如果程序中不再使用我的对象“c”,它将从“对象”映射中删除。
到目前为止,还不错。
但是如果我有两张 map 会怎样呢?
private static WeakHashMap<Object, WeakReference<Object>> objects1 = new WeakHashMap<>();
private static WeakHashMap<Object, WeakReference<Object>> objects2 = new WeakHashMap<>();
City c = new City();
objects1.put(c, new WeakReference<Object>(c));
objects2.put(c, new WeakReference<Object>(c));
在这种情况下,GC 会收集对象“c”吗?
最佳答案
拿一张纸,以对象为顶点,以引用为边绘制图形。
如果您找不到从 GC 根(例如堆栈上的静态字段或局部变量)到请求中的对象的强边路径,那么它不是强可达的,因此符合 GC 的条件。
关于java - 垃圾收集器使用 2 个 WeakHashMaps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38249502/