【发布时间】:2016-01-20 09:50:06
【问题描述】:
在执行m1 = null;m2 = null;后我很困惑。有多少对象符合垃圾回收条件?
public class MyTest {
MyTest m;
void show() {
System.out.println("Hello this is show method.");
}
public static void main(String args[]) {
MyTest m1 = new MyTest();
MyTest m2 = new MyTest();
MyTest m3 = new MyTest();
m1.m = m2;
m2.m = m3;
m3.m = m1;
m1 = null;
m2 = null;
// Question here: How many objects will be eligible for garbage collection?
}
}
【问题讨论】:
-
m3 到垃圾收集器“这不是你要找的两个实例!”
-
@rakeb.mazharul:有趣吗?问题的可达性方面非常简单,在“三个房子由单向街道连接成一个循环。我可以从房子 A 开车到哪些?”的水平上。如果您要推理任何重要的垃圾收集程序的内存行为,那么这种事情需要成为第二天性。由于优化存在一些复杂性,但接受的答案甚至没有提到这一点,我怀疑大多数选民都注意到了。
-
每个答案都说“三”或“零”。这个问题无法回答,因为我们不知道 args 数组中有多少对象。人们认为数组及其元素不是对象吗?
-
@EricLippert 但是元素 m1、m2 或 m3 都不在 args 数组中。并且 args 数组中的所有元素都是可访问的,所以我看不到 args 数组如何影响可用于 GC 的对象数量。
-
@taemyr,它们必须可以从活的根中访问。为什么args还活着? GC 可以知道它从未被使用过,因此可能已经死亡。