下列描述正确的是:
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.start() 方法时,分析上如图。
b = null; 此时 GC Roots 直接到 b 对象的关联断开,但此时对象a和b到GC Roots都有引用链相连,此对象依然是可用的。对象a和b都不会被回收。
a = null ; 此时GC Roots到对象a和GC Roots到对象b的关联都断开,也就是说两个对象到GC Roots没有引用链相连。此时对象a和对象b都是可回收的。
所以A 是错误的 BC是真确的。
对于E 不会发生内存溢出
D与F:我们先看一下在程序的代码中没有System.gc();方法也就是说GC的触发是不可控制的。什么时候触发垃圾回收机制主要是看内存。
tem.gc();方法也就是说GC的触发是不可控制的。什么时候触发垃圾回收机制主要是看内存。