二重にリンクされたリストがあるとします。私はそれをそのように作成します:
MyList list = new MyList();
次に、いくつかのノードを追加して使用し、その後、次のように古いリストを破棄することにします。
list = new MyList();
新しいリストを作成したばかりなので、古いメモリ領域内のノードはまだ相互にポイントしています。それは、古いノードのあるリージョンがガベージコレクションされないことを意味しますか?各ノードがnullを指すようにして、GCされるようにする必要がありますか?
いいえ、必要ありません。Java GCは循環参照を適切に処理します。
概念的には、GCが実行されるたびに、システム内のすべての「ライブ」ルート参照が調べられます。
Class
オブジェクトによって参照され、次にClassLoader
s によって参照されますが、今のところは無視します)それらの「既知のライブ」オブジェクトを使用して、オブジェクト内のフィールドを調べ、リストに追加します。システム内のすべてのライブオブジェクトが見つかるまで、これらの参照オブジェクトに再帰します。その後、ガーベッジは、ライブと見なされていないすべてのものを収集します。
循環的に参照されるノードは相互に参照しますが、ライブオブジェクトはそれらを参照しないため、ガベージコレクションの対象になります。
これは、ガベージコレクタが概念的にどのように機能するかを大幅に簡略化した要約であることに注意してください。実際には、世代、コンパクション、並行性の問題など、非常に複雑です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加