有没有办法测试何时从弱集中删除元素?
Is there a way to test when an element is removed from a weak set?
在以下代码片段(其唯一目的是教育测试)中,contains()
总是 ↲ 真。
Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
weakSet.add("someKey");
System.gc();
weakSet.contains("someKey");
我希望 JVM 完成的 best effort 回收 space 包括删除仅弱可达的对象(没有任何强引用的弱集元素)。但我错了。
那么,有没有办法在实践中测试弱引用的自动删除,这样你就可以看到引用消失了?换句话说,如何让 contains()
return 为假?
正如@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"
这里通常会发生什么:我们将新对象添加到集合中 (weakSet.add(new Object())
)。但是因为我们没有保留对它的任何引用,GC 会发现这个对象将从集合中删除。
需要 GC 循环,因为无法保证在这个简单的示例案例中进行垃圾回收。
在以下代码片段(其唯一目的是教育测试)中,contains()
总是 ↲ 真。
Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
weakSet.add("someKey");
System.gc();
weakSet.contains("someKey");
我希望 JVM 完成的 best effort 回收 space 包括删除仅弱可达的对象(没有任何强引用的弱集元素)。但我错了。
那么,有没有办法在实践中测试弱引用的自动删除,这样你就可以看到引用消失了?换句话说,如何让 contains()
return 为假?
正如@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"
这里通常会发生什么:我们将新对象添加到集合中 (weakSet.add(new Object())
)。但是因为我们没有保留对它的任何引用,GC 会发现这个对象将从集合中删除。
需要 GC 循环,因为无法保证在这个简单的示例案例中进行垃圾回收。