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

时间:2010-03-12 09:44:23

标签: java garbage-collection

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

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

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

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

9 个答案:

答案 0 :(得分:9)

  

现在应该是对象B和对象C.   垃圾收集者收集了什么?

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

如果没有对象的引用,则适合GC继续

答案 8 :(得分:0)

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