给定下面的代码。

class A {
    private B b;
    public A() {
        b = new B();
    }
}

class Main {
    public static void main(String[] args) {
        A a = new A(); // two objects are created (a and b)
        // <-- is B object, referenced only by private a.b eligible for garbage collection?
        keepAlive(a);
    }
}

创建A对象后,是否可以对B对象进行垃圾回收?

最佳答案

我认为不可以,因为仍然可以通过反射(使用setAccessible(true))访问此字段。

从理论上讲,编译器可以证明该字段永远不会被访问,这将使B有资格进行垃圾回收(来自JLS 12.6.1 Implementing Finalization):



但我认为实际上编译器和JVM并不那么聪明

09-10 07:42
查看更多