2013-07-06 10 views
9

クラスAのオブジェクトaがあり、クラスBの別のオブジェクトbへの参照を保持しているとします。これがbへの唯一の参照です。したがって、aへのすべての参照が削除されると、aはGCの準備が整います。これは、bもガベージコレクションの準備ができていることを意味しますか?なぜなら、bには参照(内部)がありますが、aに到達できないため到達できません。オブジェクトガベージはガベージからのみ参照されていますか?

このシナリオはどのくらい正確に機能しますか?私はガベージコレクションの順序を意味します。

+0

可能重複http://stackoverflow.com/questions/1910194/garbage-collection-in-java-and - 循環参照) – delnan

+1

ガベージコレクタがガベージコレクションと残りの収集に適しているかどうかを判断する方がよいでしょう。それが根本から見ることができるならそれは控えめではありません –

答えて

13

オブジェクトがルートから到達できなくなると、そのオブジェクトが収集されます。 GCルーツについては、this questionを参照してください。

サブグラフ内のどのノードにも到達することができないと仮定して、(あなたの説明どおりに)全体のサブグラフが収集されます。

Java(および.NET)を使用マークとスイープこの種の問題を扱うガベージコレクション。

循環参照に到達できない場合、参照カウントベースのシステム(C++のstd::shared_ptr<T>など)が失敗することがあります。これはJava/.NET GCでは問題ありません。

+0

+1私はここでダウン投票の理由を見ません。 –

+3

理由がないのにdownvoterがある場合、良い答えのためにupvote who私のような他の人があります:) –

1

Java GCは、孤立したオブジェクトの島を収集するのに十分なほどスマートです。したがって、bもガベージコレクションの対象となります。ここで留意すべき点は、bへの参照がありますが、ライブではなく、プログラムのルートから到達できないという点です。

+1

この良いまたは循環参考(AはBとBをAへの参照を持つことはできません)収集されたものの、到達不能になる可能性もあります。 –

+0

なぜ投票が下りましたか? –

+0

この質問では多くの良い答えを投票しているようです。一部の人々はちょうどそうです –

0

これはGCによって異なります。 JVMは異なるGCを使用するように指示することができ、通常は3つのGCを1つ(eden、copy、markcompact)として使用します。説明した状況を参照カウントのいずれかの典型的なGC

あなたはは、両方のOBJSが収集され、きれいに処理されます。 2段階で考えてみましょう。最初に "a"が注目され収集された後、 "b"が注目され収集されます。再び:特定の通知方法はGCに依存します。

+0

循環参照がある場合、refcountingが失敗するのは私の経験です。すなわち、A-> BおよびB-> Aの場合、両方とも1のカウントを有するが、いずれも到達可能ではない。 –

+2

OPが記述したものには、 "b"から "a"への参照はありません。 –

+0

真実ですが、私が誤解していない場合は、あなたの答えがあなたの編集の前に強調されませんでした。いずれにせよ、GCはOPが明らかに新しいものであり、我々は導入の側面から離れているかもしれない巨大なトピックです:) –

-1

これはまさにGCの要点です。 bはメインスレッドから到達できないため、ガベージコレクトされます。それは重要なカウントだけではありません。

関連する問題