gpt4 book ai didi

java - WeakHashMap 是否在 full GC 期间被清除?

转载 作者:搜寻专家 更新时间:2023-10-30 21:18:28 25 4
gpt4 key购买 nike

我在使用 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。我不明白为什么?

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

最佳答案

即时编译器分析代码,发现循环后没有使用anObjectanOtherObject,将它们从局部变量表或集合中移除它们为 null,而循环仍在运行。这称为 OSR 编译。

稍后 GC 收集字符串,因为没有对它们的强引用。

如果您在循环后使用 anObject,您仍然会得到一个 OutOfMemoryError

更新:您会找到关于 OSR compilation 的更详细的讨论。在我的博客中。

关于java - WeakHashMap 是否在 full GC 期间被清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com