SCJP模拟问题:有多少对象有资格进行垃圾回收?

vmg*_*vmg 3 java garbage-collection scjp

我被问到一个问题(在这个网站http://scjptest.com/上):在这行代码示例中有多少对象符合垃圾收集的条件//某些代码在这里?

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

class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
}

public class Test { 
    public static void main(String args[]) {
        A aa = new A();
        aa = null;
        // some code goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

正确答案是:"a和b引用的对象有资格进行垃圾回收." 但为什么?它们包含彼此的循环引用,它们可以相互访问.

谢谢!

Pét*_*rök 5

它们包含彼此的循环引用,它们可以相互访问.

是的,但它们不再可以从其他任何地方访问,因此它们不再可以在程序中被看到和使用.

早期的GC在收集这些自我引用的对象组时遇到了问题,但对于现代的收集者而言,这是一个已解决的问题.

简而言之,GC可以遍历已知静态和堆栈对象的引用Web,也可以

  • 复制发现到新内存池的所有对象,自动留下任何"死"对象(这是"年轻代"策略),或者
  • 标记所有找到的对象,这样一旦遍历了整个引用网,它就可以删除所有未标记的对象(这是"旧/终身代"策略).