0

Java のガベージ コレクションのしくみに少し混乱しています。

オブジェクトへのライブ参照がなくなると、オブジェクトがガベージ コレクションの対象になることがわかりましたが、ライブ オブジェクトへの参照がある場合はどうなるでしょうか。

再びより多くのノードを参照するノードのコレクションがあるとしましょう

List
1 -> Node a -> Node b
2 -> Node c -> Node d
3 -> Node d -> Node c
4 -> Node e
5

リストを削除すると、ノード cd と e がガベージ コレクションされるはずです。ノード e にはこれ以上の参照がなく、ノード c と d には循環参照があります。

しかし、ノード a はどうでしょうか。ガベージコレクションされますか?

ノード b に外部のライブ参照があるかどうかは異なりますか? ノード b が別の場所から参照されている場合、ノードはメモリ内に留まりますか?

4

3 に答える 3

4

ライブと見なされる参照のルート セット (現在のローカル変数、静的参照、スタック フレームのオペランド スタック) があります。この参照のルート セットから到達できないものはすべて、ガベージ コレクションの対象になります。

ノード a には、それを指す参照がありません。そのため、ライブ オブジェクトを参照している場合でも gc の対象となります。ノード b はライブ参照を持っているため、gc されません。

于 2013-01-11T13:10:25.303 に答える
2

ノードBに他の参照がある場合、ノードAのガベージコレクションには関係ありません。ノードAに参照がない場合は、ガベージコレクションが行われます。ノードBにはまだライブ参照があるため、ノードBは残ります。

基本的に、ライブ参照がないすべてのオブジェクトが収集されます。それらのオブジェクトに含まれるオブジェクトはすべて同じメカニズムの対象となり、それらへの参照が他にない場合は、それらもガベージコレクションされます。他のオブジェクトからのライブ参照がある場合、それらは残ります。

于 2013-01-11T13:07:23.140 に答える
0

GCは、すべてのライブオブジェクトを新しいメモリ領域にコピーし、コピーされなかったものはすべて次回上書きされるため、どのオブジェクトがライブであるかを認識します。

これは、OracleVMでのGCの現在の実装に有効であることに注意してください。他のVMはそれを別の方法で処理できます。

于 2013-01-11T13:06:26.533 に答える