有多少对象符合垃圾收集器的条件?

时间:2012-11-13 21:12:22

标签: java garbage-collection

当Tester类的main方法到达终点时,有多少对象符合垃圾回收的条件?我的印象是答案是两个,特别是a1,b1。但是我发现某处是核心答案,只有a1对象才有资格。我认为既然我们没有在a2中将b1作为成员变量赋值,那么b1在主要结束之前被赋值为null,它应该由垃圾收集器收集。什么是真的?

class B {
}

class A {
    static B b1;
    B b2;
}

public class Tester {
    public static void main(String[] args) {
        B b1 = new B();
        B b2 = new B();
        A a1 = new A();
        A a2 = new A();
        a1.b1 = b1;
        a1.b2 = b1;
        a2.b2 = b2;
        a1 = null;
        b1 = null;
        b2 = null;
    }
}

3 个答案:

答案 0 :(得分:2)

最初分配给方法范围变量b1的对象不符合收集条件,因为Class A中对它的引用是静态。它不会与a1的特定实例一起到期。虽然a1.b1A.b1是相同的引用,但它是一种不稳定的java语法,但它就是它的本质。无论A的任何实例(如a1)发生什么情况,该引用都将保持有效,直到A类未加载/ JVM存在为止。

代码将方法中的指针b1指定为null,但不会将A.b1指定为null。

答案 1 :(得分:0)

你唯一没有废除的参考是a2。您的答案将是a2

中无法追踪的任何对象

所以你有a2,而b2引用了a2.b2

a1和(在main方法的范围内)不能,因此被垃圾收集。

actaually,affe是对的,b1是静态的,因此是可以访问的。

答案 2 :(得分:0)

  • a2 - 因为它没有被取消
  • b2(分配给b2的原始对象) - 因为它由a2持有
  • b1(分配给b1的原始对象) - 因为它保存在static变量中