重複の可能性:
Java のガベージ コレクションと循環参照
メモリに十分なスペースがない場合、Java はガベージ コレクタを実行します。これは、参照されていないオブジェクトを削除することによって行われます。では、オブジェクトがそれ自体を指すポインターを持っている場合、または常にそれへのポインターを持つ循環ポインティング構造がある場合はどうなるでしょうか? ガベージ コレクタは失敗するのでしょうか、それとも失敗させるために私たちが行ったそのような陰湿な試みを認識してしまうのでしょうか?
重複の可能性:
Java のガベージ コレクションと循環参照
メモリに十分なスペースがない場合、Java はガベージ コレクタを実行します。これは、参照されていないオブジェクトを削除することによって行われます。では、オブジェクトがそれ自体を指すポインターを持っている場合、または常にそれへのポインターを持つ循環ポインティング構造がある場合はどうなるでしょうか? ガベージ コレクタは失敗するのでしょうか、それとも失敗させるために私たちが行ったそのような陰湿な試みを認識してしまうのでしょうか?
Java ガベージ コレクタは、静的変数またはローカル変数が指すオブジェクトのメモリ、またはそれらのオブジェクトから (再帰的に) リンクされたオブジェクトが指すメモリを再利用しません。したがって、オブジェクトのリンク ツリーが大きい場合、ツリーまたはループのルートを指す変数がある場合、ガベージ コレクターはそのスペースを再利用しません。
ループ内でリンクされたオブジェクトのメモリは、ループ内のオブジェクトを指す静的変数またはローカル変数がない限り、再利用されます。したがって、ガベージ コレクションを効率的に機能させたい場合は、オブジェクトが不要になったときに変数を null にするようにしてください。
ガベージ コレクタは、オブジェクトが循環的にリンクされているかどうかを検出し、気にしません。変数からオブジェクトに到達できるかどうかだけが重要です。
オブジェクトが収集されるかどうかは、ガベージ コレクション アルゴリズムによって異なります。
ガベージ コレクターは、参照のルート セット (現在のローカル変数、静的参照、スタック フレームのオペランド スタック)からアクセスできないオブジェクトを収集します。これは、他のオブジェクトによって参照されているオブジェクトであっても収集できることを意味します。
したがって、ルート セットからサイクルを形成するオブジェクトに推移的に移動する参照パスが他にない場合、各オブジェクトが参照されていても、循環ポインタ構造は収集されます。
Java ガベージ コレクタのトリガーも参照してください。
「A がオブジェクト B を参照し、B が A を参照する」ことを孤立した島と呼びます。GC は、そのようなことを検出するのに十分スマートです。アイランド内のオブジェクトへの参照がない場合、アイランド全体がガベージ コレクションの対象となります