在下面的代码片段(其唯一目的是教育测试)中,contains()总是↲true。
Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
weakSet.add("someKey");
System.gc();
weakSet.contains("someKey");我期望由JVM完成的回收空间的best effort包括移除仅弱可达的对象(没有任何强引用的弱集合元素)。但我错了。
那么,有没有一种方法可以在实践中测试弱引用的自动移除,这样你就可以看到引用消失了?换句话说,如何让contains()返回false?
发布于 2017-02-01 07:26:58
正如@Chai T.Rex在评论中正确提到的那样,字符串是垃圾收集的坏例子。要查看如何从弱集中垃圾收集对象,请尝试以下修改后的代码版本:
Set<Object> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
weakSet.add(new Object());
System.out.println(weakSet.size()); // prints "1"
while (weakSet.size() > 0)
System.gc();
System.out.println(weakSet.size()); // prints "0"这里通常发生的事情:我们将新对象添加到set (weakSet.add(new Object()))中。但是因为我们没有在它上面保留任何引用,GC会发现这个对象将从set中删除。
循环是必需的,因为在这个简单的示例中不能保证垃圾收集。
https://stackoverflow.com/questions/41969104
复制相似问题