1

当 Tester 类的 main 方法结束时,有多少对象符合垃圾回收条件?我的印象是答案是两个,特别是a1,b1。但是,我在某个地方找到了正确的答案,只有 a1 对象符合条件。我认为,由于我们没有将 b1 分配为 a2 中的成员变量,因此 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;
    }
}
4

3 回答 3

2

最初分配给方法范围变量的对象b1不符合收集条件,因为对它的引用Class A静态的。它不会随着 a1 的特定实例过期。这是一个狡猾的 Java 语法,a1.b1并且A.b1是相同的参考,但它就是这样。该引用一直有效,直到类 A 被卸载/JVM 存在,无论 A 的任何实例(例如 a1)发生什么情况。

代码将方法中的指针分配b1给 null,但它没有分配A.b1给 null。

于 2012-11-13T21:17:01.860 回答
0

好吧,您没有取消的唯一参考是a2. 您的答案将是您无法追踪的任何对象a2

所以你有a2,并且b2被引用a2.b2

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

实际上,affe 是正确的,b1是静态的,因此是可访问的。

于 2012-11-13T21:15:00.807 回答
0
  • a2- 因为它没有被取消
  • b2(分配给的原始对象b2) - 因为它由 a2 持有
  • b1(分配给的原始对象b1) - 因为它保存在static变量中
于 2012-11-13T21:17:33.667 回答