如何确定在给定程序中符合垃圾收集条件的对象?

时间:2012-10-26 08:49:37

标签: java garbage-collection scjp

假设:

 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行时,有多少对象符合垃圾回收的条件?

3 个答案:

答案 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中,每个t1t2指向另一个,加上字段t指向其中一个。所以没有对象可以被GC,因为参考链:

t -> t2

t2 -> t1