在牛客网上,看到一道简单的关于对象内存引用的小问题。觉得挺经典的。
这是题目:
public class Test {
public static class A {
private B ref;
public void setB(B b) {
ref = b;
}
}
public static Class B {
private A ref;
public void setA(A a) {
ref = a;
}
}
public static void main(String args[]) {
…
start();
….
}
public static void start() { A a = new A();
B b = new B();
a.setB(b);
b = null; //
a = null;
…
}
}
给出的答案:
A:b = null执行后b可以被垃圾回收
B:a = null执行后b可以被垃圾回牧
C:a = null执行后a可以被垃圾回收
D:a , b必须在整个程序结束后才能被垃圾回收
E:类A和类B在设计上有循环引用,会导致内存泄露
F:a, b 必须在start方法执行完毕才能被垃圾回收
正确答案BC
通过画图可知,上述代码中对象a有对对象b的引用。所以根据可达性分析。如果a和b都能够被垃圾回收时,需要将a=null。说明BC是正确的。相对应的ADF就是错误的。
在图上也可以看出来,仅有,类A对类B的引用,没有类B对类A的引用,所以并没有造成循环引用。