假设:
public class Trees {
Trees t;
public static void main(String[] args) {
Trees t = new Trees();
Trees t2 = t.go(t);
t2 = null;
// more code here : LINE 11
}
Trees go(Trees t) {
Trees t1 = new Trees();
Trees t2 = new Trees();
t1.t = t2;
t2.t = t1;
t.t = t2;
return t1;
}
}
当到达第11行时,有多少对象符合垃圾回收的条件?
答案 0 :(得分:3)
您已询问如何确定符合gc条件的对象数量。解决这些问题的最简单方法是绘制一个图表,显示参考(在您的示例中为t,t1,t2)和实际对象本身。一旦对象没有连接到任何引用,Java代码就无法访问它,因此它有资格进行收集。
此链接显示了一个示例以及如何绘制图表
http://radio.javaranch.com/corey/2004/03/25/1080237422000.html
答案 1 :(得分:2)
您可以创建三个对象:
Object "a": Trees t = new Trees();
Object "b": Trees t1 = new Trees();
Object "c": Trees t2 = new Trees();
在第11行,它们都没有资格进行垃圾收集,因为变量t(在main中声明)仍然具有对象“a”的引用,并且“b”和“c”都可以从“a”到达”
答案 2 :(得分:1)
根据您的代码段,当控件到达“第11行”时,没有任何对象可以GC
。
原因:
Trees t;
是一个字段,因此现在无法进行GC。 go
后,t2将等于null
。但是,在方法go
中,每个t1
和t2
指向另一个,加上字段t
指向其中一个。所以没有对象可以被GC,因为参考链: t -> t2
t2 -> t1