我想知道Java中的垃圾收集器如何处理以下情况。
对象A具有对象B的引用,而对象B具有对对象C的引用。 主程序引用了对象A. 因此,您可以通过对象A使用对象B,通过对象A通过对象C使用对象C.
如果对象A和对象B之间的链接设置为null,对象B和对象C会发生什么?
垃圾收集器现在是否收集了对象B和对象C?我的意思是对象B和对象C之间仍然存在连接。
答案 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非常聪明,可以一次扫描它们。