Java スレッドのガベージ コレクション
Java プログラミング コミュニティで繰り返し質問されるのは、スレッドのガベージ コレクションに関するものです。次のコードを考えてみましょう:
<code class="java">public class TestThread { public static void main(String[] s) { // anonymous class extends Thread Thread t = new Thread() { public void run() { // infinite loop while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } // as long as this line printed out, you know it is alive. System.out.println("thread is running..."); } } }; t.start(); // Line A t = null; // Line B // no more references for Thread t // another infinite loop while (true) { try { Thread.sleep(3000); } catch (InterruptedException e) { } System.gc(); System.out.println("Executed System.gc()"); } // The program will run forever until you use ^C to stop it } }</code>
ここでは、スレッドが作成され (行 A)、それへの参照が null に設定されます (行 B)。スレッド オブジェクトには参照がないため、ガベージ コレクションが実行されることが期待されますが、スレッドは無限に実行され続けます。
スレッドのガベージ コレクションについて
理由この動作は、「ガベージ コレクション ルート」の概念に基づいています。実行中のスレッドはガベージ コレクション ルートとみなされます。これは、ガベージ コレクタが到達可能性を判断する基準点の 1 つであることを意味します。つまり、スレッドが実行されている限り、メイン スレッドからの参照がなくても、スレッド自体は存続します。
スレッド管理への影響
この動作は、Java での適切なスレッド管理に影響を与えます。スレッドへのすべての参照がメイン スレッドから削除されたとしても、スレッド自体が必ずしもガベージ コレクションの対象となるわけではないことを理解することが重要です。スレッドが不要になったときにスレッドを明示的に終了または中断するのはアプリケーションの責任です。
結論
最初の想定に反して、Java のスレッドはそれらへのすべての参照が削除されると、自動的にガベージ コレクションが行われます。代わりに、実行中のスレッドはガベージ コレクション ルートとみなされ、スレッド自体のクリーンアップが妨げられます。適切なスレッド管理では、リソース リークやパフォーマンスの問題を避けるために、不要になったスレッドを明示的に終了または中断する必要があります。
以上がスレッド参照を Null に設定すると、Java でのガベージ コレクションが保証されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。