1

如果对象 A 具有对象 B 的引用,而对象 B 具有对象 A 的引用并且它们没有任何其他实时引用,那么它们是否有资格进行 GC?

4

2 回答 2

3

是的。如果对象不可访问,Java 中的对象垃圾收集可能会发生。它不受循环引用的影响。

java.lang.ref的包文档提供了可达性的一种定义:

从最强到最弱,不同级别的可达性反映了一个对象的生命周期。它们在操作上定义如下:

  • 如果某个对象可以被某个线程访问而无需遍历任何引用对象,则该对象是强可达的。创建它的线程可以强烈访问新创建的对象。如果一个对象不是强可达但可以通过遍历软引用来达到,那么它就是软可达的。
  • 一个对象是弱可达的,如果它既不是强可达也不是软可达,但可以通过遍历弱引用来达到。当对弱可达对象的弱引用被清除时,该对象就有资格进行终结。
  • 如果一个对象既不是强、软或弱可达的,它是最终确定的,并且一些幻象引用引用它,它就是幻象可达的。
  • 最后,当一个对象无法通过上述任何一种方式到达时,它是不可达的,因此有资格进行回收。
于 2013-08-20T12:48:38.733 回答
0

如果无法通过从垃圾收集根开始的链访问对象,Java 的 GC 将其视为“垃圾”,因此将收集这些对象。即使对象可能相互指向形成一个循环,如果它们从根部被切断,它们仍然是垃圾。

于 2013-08-20T12:52:45.197 回答