WeakHashMap 在完整 GC 期间是否被清除?

2024-03-09

我在使用 Wea​​kHashMap 时遇到了一些麻烦。

考虑这个示例代码:

List<byte[]> list = new ArrayList<byte[]>();

Map<String, Calendar> map = new WeakHashMap<String, Calendar>();
String anObject = new String("string 1");
String anOtherObject = new String("string 2");

map.put(anObject, Calendar.getInstance());
map.put(anOtherObject, Calendar.getInstance());
// In order to test if the weakHashMap works, i remove the StrongReference in this object
anObject = null;
int i = 0;
while (map.size() == 2) {
   byte[] tab = new byte[10000];
   System.out.println("iteration " + i++ + "map size :" + map.size());
   list.add(tab);
}
System.out.println("Map size " + map.size());

这段代码有效。在循环内部,我正在创建对象。当发生较小的 GC 时,第 1360 次迭代时映射大小等于 1。一切都好。

现在当我评论这一行时:

//anObject = null; 

我预计会出现 OutOfMemoryError,因为 mapSize 始终等于 2。但是在第 26XXX 次迭代时,发生完整 GC,并且映射大小等于 0。我不明白为什么?

我认为地图不应该被清除,因为也有对这两个对象的强引用。


即时编译器分析代码,发现anObject and anOtherObject循环后不再使用,并将它们从局部变量表中删除或设置为null,而循环仍在运行。这称为 OSR 编译。

随后 GC 会收集这些字符串,因为不再保留对它们的强引用。

如果你用过anObject循环之后你仍然会得到OutOfMemoryError.

Update:您会发现有关以下内容的更详细讨论OSR编译 http://jonisalonen.com/2012/can-your-interpreter-do-this/在我的博客中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WeakHashMap 在完整 GC 期间是否被清除? 的相关文章

随机推荐