允许死内存的Java垃圾收集?

允许死内存的Java垃圾收集?,java,garbage-collection,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 run

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

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;
    }
}
这显然是一个愚蠢的计划,但是: 我想知道A和B的例子会发生什么? 它们都是相互参照的,因此不应被视为收藏品。 但事实上,它们对程序的其余部分来说是死的,因为它们永远不会被引用

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


提前谢谢

一旦
Start
的构造函数结束,任何“根”都无法访问
a
b
这两个引用,因此它们有资格进行垃圾收集。根通常是调用堆栈上的变量或全局变量


一些垃圾收集器(例如使用垃圾收集器的垃圾收集器)在循环引用方面可能会遇到困难,但现代地面军事系统可以毫无问题地处理这种情况。

一旦
Start
的构造函数结束,任何“根”都无法访问两个引用
a
b
所以他们有资格进行垃圾收集。根通常是调用堆栈上的变量或全局变量


一些垃圾收集器(例如使用垃圾收集器的垃圾收集器)在循环引用方面可能会遇到困难,但现代地面军事系统可以毫无问题地处理这种情况。

垃圾收集器会收集垃圾收集器,因为它们不再可及


它们被垃圾收集器收集,因为它们不再可访问


Start
构造函数完成时,
a
b
都不在范围内。当
Start
构造函数完成时,
a
b
都不在范围内。@Oak我已澄清。@Oak我已澄清。