首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以测试一个元素何时从弱集中被移除?

有没有一种方法可以测试一个元素何时从弱集中被移除?
EN

Stack Overflow用户
提问于 2017-02-01 07:02:20
回答 1查看 77关注 0票数 1

在下面的代码片段(其唯一目的是教育测试)中,contains()总是↲true。

代码语言:javascript
复制
    Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>());
    weakSet.add("someKey");
    System.gc();
    weakSet.contains("someKey");

我期望由JVM完成的回收空间的best effort包括移除仅弱可达的对象(没有任何强引用的弱集合元素)。但我错了。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 07:26:58

正如@Chai T.Rex在评论中正确提到的那样,字符串是垃圾收集的坏例子。要查看如何从弱集中垃圾收集对象,请尝试以下修改后的代码版本:

代码语言:javascript
复制
    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中删除。

循环是必需的,因为在这个简单的示例中不能保证垃圾收集。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41969104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档