循环GC是否在地图中工作?

时间:2011-10-26 08:24:29

标签: java garbage-collection weak-references

我有一个User对象强烈引用Data对象。

如果我使用弱键创建Map<Data, User>(使用Guava MapMaker),只有在其他地方没有引用时才会删除这样的密钥。但是,它总是被它映射到的User对象所引用,而这只是在删除Data键时从地图中删除,即从不,除非GC的圆形参考检测在穿越地图时也有效(我希望你理解我的意思:P)

如果User s + Data不再在应用程序的其他地方使用,那么它们是否会被垃圾收集,或者我是否还需要指定弱值?

2 个答案:

答案 0 :(得分:4)

GC不会检测循环引用,因为它不需要。

所采用的方法是保留从根节点强引用的所有对象,例如线程堆栈。这样就可以收集强烈无法访问的对象(带有循环引用或非循环引用)。

编辑:这可能有助于解释“神话”

http://www.javacoffeebreak.com/articles/thinkinginjava/abitaboutgarbagecollection.html

  

引用计数通常用于解释一种垃圾收集,但似乎并未在任何JVM实现中使用。

这是一个有趣的链接http://www.ibm.com/developerworks/library/j-jtp10283/

答案 1 :(得分:0)

在文档中,您会看到: weakKeys() 指定存储在地图中的每个键(不是值)应该包装在WeakReference中(默认情况下,使用强引用)。

因为它是弱参考,它将被收集。

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/MapMaker.html