1

このコード例で何が起こるのだろうと思いました:

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 のインスタンスに何が起こるかをさまよいました。どちらも相互に参照されているため、収集可能とは見なされません。しかし実際には、それらは二度と参照されないため、プログラムの残りの部分に対して死んでいます。

だから私の質問は、それらはガベージコレクションされるでしょうか? それとも死んだ記憶ですか?

前もって感謝します!

4

2 に答える 2

6

Startのコンストラクターが終了すると、2 つの参照とabどの「ルート」からも到達できないため、ガベージ コレクションの対象になります。通常、ルートはコール スタック上の変数またはグローバル変数です。

一部のガベージ コレクター (参照カウントを使用するものなど) は循環参照に問題がある場合がありますが、最新の GC はそのような状況を問題なく処理できます。

于 2013-09-24T11:27:17.233 に答える
1

それらはもはや到達できないため、ガベージコレクターによって収集されます。

Javaでは、オブジェクトが到達不能になるのはいつですか?

于 2013-09-24T11:28:06.847 に答える