3

これはインタビューの質問ですが、正解についてはよくわかりません。次のようなクラスがあるとします。

public class A {
    public Object link;
    public A() {
        link = null;
    }
}

次に、2 つのインスタンスを作成します。

A a1 = new A();
A a2 = new A();
a1.link = a2;
a2.link = a1;

次に、参照を解放します。

a1 = null;
a2 = null;

次に問題は、JVM が GC メカニズムを使用するためです。このケースをどのように処理しますか?実行時に 2 つのインスタンスを即座に削除しますか、それとも単にメモリ空間に署名を付けてそのままにしておくのでしょうか? 循環を形成し、外部参照を持たないそのようなインスタンスが 100 万個ある場合はどうなりますか? クリーニングによって GC スレッドが停止しますか?

4

3 に答える 3

3

オブジェクト自体は、必要な数のリンク (言及したように 100 万サイクル) で相互に参照できます。スレッドに戻る「ルート」がない場合、オブジェクトが接続している他のガベージ対象ノードの数に関係なく、オブジェクトはガベージ コレクションの対象となります。

これは、彼らが収集されるという意味ではなく、資格があるということだけです。したがって、ガベージ コレクターがそれらを処理しないと決定した場合、それはメモリ リークと見なすことができると思います。それらが消えることを保証することはできません。

于 2012-11-28T03:43:10.550 に答える
2

循環参照は、参照カウントなどの特定のガベージ コレクション戦略の単純な実装でメモリ リークを引き起こす可能性があります。(これは、参照カウントがナイーブだと言っているわけではありませんが、貧弱な実装では問題が発生する可能性があるということです。)

ただし、この問題は GC を実装している人々にはよく知られており、回避することができます。さらに、最近のほとんどの JVM は、通常、このような問題に悩まされない世代別ガベージ コレクタを使用しています。

于 2012-11-28T03:42:47.647 に答える
0

コードの現在のロジックによると、a1にはa2を指すメンバー変数があり、a2にはa1を指すメンバー変数があります。a1 = nullを実行すると、a1はGCedの対象になります。a2の場合も同様です。GCを実行すると、ルートから開始して到達可能なすべてのオブジェクトを確認しようとします。これら2つは相互に参照していても、ルートから開始してチェーンで到達不能になるため(分離の場合)、問題なくガベージコレクションが実行されます。

于 2012-11-28T03:48:01.993 に答える