java-垃圾收集器与2 WeakHashMaps一起使用
作者:互联网
我有用WeakHashMap实现的缓存,如下所示:
private static WeakHashMap<Object, WeakReference<Object>> objects = new WeakHashMap<>();
我有一个City类的实例:
City c = new City();
我现在将此实例添加到我的地图中,如下所示:
objects.put(c, new WeakReference<Object>(c));
根据WeakHashMap jvm的实现,如果key对其没有强引用,则会从地图中将其删除(在空闲时间).
因此,如果我的对象“ c”不再在程序中使用,它将从“对象”映射中删除.
到现在为止还挺好.
但是如果我有两张地图怎么办?
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.
标签:caching,weakhashmap,java,garbage-collection 来源: https://codeday.me/bug/20191026/1939986.html