Java中的垃圾收集如何工作?

我想知道Java中的垃圾收集器如何处理以下情况。

对象A具有对象B的引用,而对象B具有对对象C的引用。主程序具有对象A的引用。因此,您可以通过对象A使用对象B,通过对象A通过对象B使用对象C.

如果对象A和对象B之间的链接设置为null,对象B和对象C会发生什么?

现在垃圾收集器是否收集了对象B和对象C? 我的意思是对象B和对象C之间仍然存在连接。

现在垃圾收集器是否收集了对象B和对象C?

是。 好吧,它们是收集的候选者,因为没有办法通过A的根达到对象B和C.

是的,B和C有资格进行垃圾收集,如果无法从任何GC根目录到达(GC根通常是所有线程和堆栈上的所有引用)。

你不能指望垃圾收集器在特定时间工作,因为它的行为是不可预测的,你只能说对象B和C只能用于垃圾收集

像往常一样,对于想要了解垃圾收集function的人来说,这篇文章是必读的。 它写得很好,并有说明图。

事实上,java中的垃圾收集是一个非常复杂的事情,远远超过Ruby解释器,作为一个例子。

无论如何,理论基础是一样的。

GC识别程序代码无法访问的对象图(也就是说它们在活动代码中没有更多引用)。 在谈论对象图时,我正好谈论B-> C对象图。 一旦它无法访问,它就可以被GC控制,但由于GC试图尽可能地优化其工作以避免减慢应用程序的速度,因此无法确定它是什么时候。

B和C可以进行垃圾回收,因为您无法再访问它们。 由于垃圾收集器的不可预测性,我们所知道的是它们很可能在将来的某个时刻被收集。

我认为逻辑是不同的。 如果无法从线程访问该对象,则可以收集该对象。

如果没有对象的引用,那么它将适合GC继续

B没有引用它所以它将首先被垃圾收集,然后它将理解C没有引用它,所以C将被垃圾收集。 这是为了说明,Jvm足够智能,可以一次扫描它们。