web-dev-qa-db-ja.com

ガベージコレクションの「孤立の島」

ガベージコレクションの孤立の島の概念を誰か説明してもらえますか?

48
Tony

オブジェクトAはオブジェクトBを参照します。オブジェクトBはオブジェクトAを参照します。オブジェクトAもオブジェクトBも他のオブジェクトによって参照されていません。それは孤立した島です。

基本的に、分離のアイランドは、相互に参照するオブジェクトのグループですが、アプリケーション内のアクティブなオブジェクトによって参照されることはありません。厳密に言えば、参照されていないオブジェクトが1つでも、孤立した島です。

コメントから編集:

class A {
   B myB; 
} 
class B { 
   A myA; 
} 

/* later */  
A a = new A(); 
B b = new B();  
a.b = b; 
b.a = a;
48
Tamas Czinege

これがこの用語の 良い説明 です。抜粋:

  • 「オブジェクトobj1がガベージコレクションされているが、別のオブジェクトobj2にその参照が含まれている場合、obj2もガベージコレクションの対象になります。」
  • 「オブジェクトobj2がガベージコレクションに適格なオブジェクトobj1にアクセスできる場合、obj2もガベージコレクションに適格です。」

これは「孤立の島」と呼ばれています。 「孤立の島」とは、1つ以上のオブジェクトが、アプリケーションのアクティブな部分からそれらへの参照を持たないことを意味します。

10
schnaader

覚えておくべきことは、オブジェクトは、GCルートオブジェクト(スレッド、現在のローカル変数、静的変数など)から直接または間接的に参照されている場合にのみ収集されるということです。 2つ(またはそれ以上)のオブジェクトが相互に参照しているが、ルートから参照されていない場合、それらはガベージコレクションの対象となります。

9
Leigh

実際、ガベージコレクションのマークアンドスイープの概念を理解していれば、孤立の島もよりよく理解できます。

  • アルゴリズムはGCルートから始まります:メインスレッド、メインメソッドのローカル変数、メインクラスの静的変数。
  • アルゴリズムは、GCルートから始めて、すべてのオブジェクト参照をトラバースし、検出されたすべてのオブジェクトを生存としてマークします。
  • マークされたオブジェクトによって占有されていないすべてのヒープメモリが再利用されます。それは単に無料としてマークされ、本質的に未使用のオブジェクトがないようにスイープされます。
  • 2つ以上のオブジェクトが相互に参照しているが、ルートにリンクされているオブジェクトによって参照されていない場合、それらは分離の島にあり、スイープされます。
3
Adrian Kreator