0

オブジェクトの二重リンク リストがあります。

class MyObject {
  MyObject previousObject;
  MyObject nextObject;

  // Other fields and methods
}

このようなリストの最初のオブジェクトのみがアプリケーションに直接格納され、他のオブジェクトはこの最初のオブジェクトを介してアクセスされ、アプリケーションで一時的に使用されます (ただし、永続的な参照はリスト自体の外部に保持されません)。

オブジェクトを参照しなくなった場合、そのオブジェクトはガベージ コレクターによって収集されます。

しかし、(最初の) オブジェクトがまだリンクされたリストの「次のオブジェクト」によって参照されているため、これがまだ当てはまるかどうか疑問に思っていましたか? リストの残りの部分についてはどうですか? これらのオブジェクトも (相互に参照されていても) 収集されますか?

注: もう使用しない場合は、リスト内のすべての参照を削除できることを知っています。しかし、これはアプリケーションの性質上「困難」であり、追加の (不要な?) オーバーヘッドが発生します。

4

3 に答える 3

4

GC は参照カウントを使用しないため、循環依存関係は適切に処理されます。何もする必要はありません。リストの要素に到達できなくなった場合、リスト全体がガベージ コレクションされます。

于 2013-02-17T11:40:31.460 に答える
1

重要な点は、GC の最初のスイープで、到達可能なすべてのオブジェクトへの参照を収集することです。その後、他のすべてを破棄します。そのようにして、余分な作業をせずに、循環参照とツリーのような巨大な自己参照構造を処理できます。

明らかに、それはそれよりもはるかに複雑です。

興味深いことに、リストの最初のアイテムに到達できないシナリオでは、さらに 3 番目のアイテム到達可能であればLinkedList、最初の 2 つのアイテムは破棄されます。ただし、ArrayList以前の要素が残っている可能性があります。

于 2013-02-17T11:47:40.833 に答える
1

リンク リスト内のどのオブジェクトもライブ ルートに接続されていない場合は、リスト全体が収集されます。ルーツとは何ですか?を参照してください。

于 2013-02-17T11:43:39.670 に答える