Java垃圾收集允许死记忆?

Jak*_*nar 1 java garbage-collection

我想知道这个示例代码会发生什么:

public class Start {
    public static void main(String[] args) {
        new Start().go();
    }

    public Start() {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
    }

    public boolean running = true;

    public void go() {
        while( running ) {
             try {
                 Thread.sleep(10);
             } catch ( Throwable t ) {}
        }
    }
}

public class A {
    B b;
    public void setB(B b) {
        this.b = b;
    }
}

public class B {
    A a;
    public void setA(A a) {
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是一个愚蠢的程序,但是:我徘徊A和B的实例会发生什么?它们都是彼此引用的,因此它们不应被视为可收集的.但实际上,他们对程序的其余部分已经死了,因为它们永远不会再被引用.

所以我的问题是它们会被垃圾收集吗?还是他们死了记忆?

提前致谢!

ass*_*ias 6

一旦Start的构造函数结束时,两个引用a,并b没有任何的'根’,使他们成为有资格垃圾收集访问.根通常是调用堆栈或全局变量上的变量.

一些垃圾收集器(例如那些使用引用计数的垃圾收集器)可能在循环引用方面存在困难,但现代GC可以毫无问题地处理这种类型的情况.