1

鉴于:

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

4

3 回答 3

3

您已询问如何确定符合 gc 条件的对象数量。解决这些问题的最简单方法是绘制一个图表,显示引用(在您的示例中为 t、t1、t2)和实际对象本身。一旦对象没有连接到任何引用,Java 代码就无法访问它,因此它就有资格被收集。

此链接显示了一个示例以及如何绘制图表

http://radio.javaranch.com/corey/2004/03/25/1080237422000.html

于 2012-10-26T09:06:00.830 回答
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”到达。

于 2012-10-26T08:58:37.447 回答
1

根据您的代码片段,当控件到达您的“第 11 行”时,无法GC编辑任何对象。

原因:

  • Trees t;是一个字段,因此现在无法进行 GC。
  • 调用后go,t2 将相等null。但是,在 method 中go,每个t1t2指向另一个,加上该字段t指向其中一个。由于引用链,因此不能对任何对象进行 GC:

t -> t2

t2 -> t1

于 2012-10-26T08:59:59.290 回答