1. ホーム
  2. java

[解決済み] Java のガベージコレクションでは、円形参照はどのように扱われるのですか?

2022-04-21 16:21:29

質問

私の理解では、Javaのガベージコレクションは、他に何もそのオブジェクトを「指して」いない場合、いくつかのオブジェクトをクリーンアップします。

質問ですが、このようなものがあった場合、どうなるのでしょうか?

class Node {
    public object value;
    public Node next;
    public Node(object o, Node n) { value = 0; next = n;}
}

//...some code
{
    Node a = new Node("a", null), 
         b = new Node("b", a), 
         c = new Node("c", b);
    a.next = c;
} //end of scope
//...other code

a , b および c はガベージコレクションされるはずですが、それらはすべて他のオブジェクトから参照されています。

Java のガベージコレクションはこれにどう対処するのでしょうか?(それとも単にメモリの消耗なのでしょうか?)

解決方法は?

Java の GC は、ガベージコレクションのルートから始まるチェーンを通して到達できないオブジェクトを "ガベージと見なし、これらのオブジェクトは回収されます。 オブジェクトがお互いを指してサイクルを形成していても、ルートから切り離されれば、それらはまだゴミなのです。

の「付録A:ガベージコレクションの真実」の到達不能オブジェクトの項を参照。 Java プラットフォームのパフォーマンス。戦略と戦術 をご覧ください。