有没有办法测试何时从弱集中删除元素?

时间:2017-01-31 23:02:20

标签: java weak-references

在以下代码段(其唯一目的是教育测试)中,contains()始终为真。

    Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
    weakSet.add("someKey");
    System.gc();
    weakSet.contains("someKey");

我希望JVM完成回收空间的best effort包括删除只能弱访问的对象(没有任何强引用的弱设置元素)。但我错了。

那么,有没有办法在实践中测试自动删除弱引用,这样你就可以看到引用了?换句话说,如何让contains()返回false?

1 个答案:

答案 0 :(得分:2)

正如@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会发现该对象将从set中删除。

需要在GC上循环,因为在这个简单的示例情况下无法保证垃圾收集。