如果对象A引用了对象B而对象B引用了对象A并且它们没有任何其他实时引用,那么它们是否有资格获得GC?
答案 0 :(得分:3)
是。如果对象不是可访问,则可能发生Java中对象的垃圾收集。它不受循环引用的影响。
java.lang.ref的包文档提供了可达性的一个定义:
从最强到最弱,不同的可达性水平反映了物体的生命周期。它们在操作上定义如下:
- 如果某个线程可以在不遍历任何引用对象的情况下到达某个对象,则可以强烈访问该对象。新创建的对象可由创建它的线程强烈访问。 如果一个对象不能很容易到达,但可以通过遍历软引用来访问它。
- 如果一个对象既不强也不可轻易到达,但是可以通过遍历弱引用来到达,则该对象是弱可达的。当清除对弱可达对象的弱引用时,该对象就有资格进行最终确定。
- 如果一个物体既不是强烈的,柔和的,也不是微弱的可触及的,那么它就是幻影可达的,它已经完成,并且一些幻象参考指的是它。
- 最后,如果无法通过上述任何方式访问某个对象,则无法访问该对象,因此有资格进行回收。
答案 1 :(得分:0)
Java的GC认为对象是“垃圾”,如果它们无法通过从垃圾收集根开始的链到达,那么将收集这些对象。尽管物体可以指向彼此形成一个循环,但如果它们从根部切断,它们仍然是垃圾。