2011-06-23 11 views
1

途中でノードを削除した場合、単独でリンクされたリストでは、リストの残りの部分もそれぞれリップル効果があるため、ガベージコレクションされますその背後にあるノードは逆参照されます。ツリーからノードを削除するときのJavaメモリの問題

私の質問は、各ノードがその子への参照と親への参照を持つツリーについてです。中間のノード(非リーフノード)を削除すると、そのノードを参照するのでメモリリークが発生し、ノードを参照することになります。したがって、サブツリーを削除したい場合は、そのノード内のすべてのノードをボトムアップから削除する必要があります。

答えて

3

到達可能性という概念についてお読みください。 javadocsで定義されています(the description of the package java.lang.ref)。

オブジェクトがどのスレッドからも強く到達できない場合、オブジェクトはガベージコレクションの対象となります。スレッドTによって強く届いている

オブジェクトは、次のとおりです。Tのコールスタック内のローカル変数が参照する

  • オブジェクト、
  • 任意のクラスの静的フィールドによって参照されるオブジェクト、および
  • オブジェクト(強く)は、強く到達可能なオブジェクトによって参照されます。

あなたが説明したツリーからノードを削除すると(親ノードの参照を子ノードに削除するだけで)、削除したノードの下のツリーの部分への参照が残りませんそれらのオブジェクトは強く到達可能ではありません。たとえそれらがある種のサイクルを形成しても、JVMはそれらのオブジェクトが強く到達可能でない(すなわち、互いに参照するが、どのコードでも到達できない)と判断するのに十分スマートです。したがって、ガベージコレクションの対象となります。

1

開始ノードを削除し、そのノードの親ノードの参照を削除することができます。

+0

しかし、開始ノードには1つの子があるとします。もし私が開始ノードを削除しても、それはまだそれを参照していないでしょうし、まだそれを参照して何かを残して子供を参照しないだろうか? – jhlu87

+2

参照を持つ他のクラスから参照されなくなったため、解放されます。ガベージコレクタはこれを判断するのに十分スマートです。 –

0

サブツリーを削除するには、親の参照を削除するだけです。 またはその子に他の参照が保持されていない限り、それはガベージコレクションされます。

関連する問題