给定下面的代码。
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并不那么聪明