我有一个User
对象强烈引用Data
对象。
如果我使用弱键创建Map<Data, User>
(使用Guava MapMaker
),只有在其他地方没有引用时才会删除这样的密钥。但是,它总是被它映射到的User对象所引用,而这只是在删除Data键时从地图中删除,即从不,除非GC的圆形参考检测在穿越地图时也有效(我希望你理解我的意思:P)
如果User
s + Data
不再在应用程序的其他地方使用,那么它们是否会被垃圾收集,或者我是否还需要指定弱值?
答案 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