我想知道Java中的垃圾回收器如何处理以下情况。
对象A引用了对象B,对象B引用了对象C。主程序引用了对象A。因此,您可以通过对象A使用对象B,并通过对象B通过对象A使用对象C。
如果将对象A和对象B之间的链接设置为null,则对象B和对象C会发生什么?
如果现在对象A和对象B之间的链接被设置为null,垃圾回收器是否应该对对象B和对象C进行回收呢?我的意思是,对象B和对象C之间仍然存在连接。
我想知道Java中的垃圾回收器如何处理以下情况。
对象A引用了对象B,对象B引用了对象C。主程序引用了对象A。因此,您可以通过对象A使用对象B,并通过对象B通过对象A使用对象C。
如果将对象A和对象B之间的链接设置为null,则对象B和对象C会发生什么?
如果现在对象A和对象B之间的链接被设置为null,垃圾回收器是否应该对对象B和对象C进行回收呢?我的意思是,对象B和对象C之间仍然存在连接。
对象B和对象C现在应该被垃圾回收器收集吗?
是的。因为没有通过根A访问对象B和C的方式,它们成为了垃圾回收的候选对象。
如果B和C无法从任何GC根(GC根通常是所有线程和堆栈上的所有引用)到达,则它们可以进行垃圾回收。
Class
来访问静态变量,而这个Class
可以通过加载它们的ClassLoader
来访问,而这个ClassLoader
又可以通过加载其他类型的对象来访问。因此,如果ClassLoader
被垃圾回收了,甚至可能会丢失静态变量的值。 - Joachim Sauer你不能指望垃圾收集器在特定时间工作,因为它的行为是不可预测的,你只能说B和C对象仅适合进行垃圾回收。
通常情况下,这篇文章是必读的,想要了解垃圾回收的人需要阅读。它写得很好,并带有解释性图示。
我认为逻辑是不同的。如果对象不能从线程访问,则可以进行回收。
如果没有对象的引用,那么垃圾回收程序就可以进行了。
B
没有引用它,因此它将首先进行垃圾回收,然后它会理解C
没有引用它,因此C
也将被垃圾回收。这只是为了说明,JVM足够聪明,可以一次性地处理它们。