スレッドはガベージ コレクションされていますか?
この例では、メイン スレッドでの参照が失われたにもかかわらずアクティブなままである実行中のスレッドを示します。
<code class="java">public class TestThread { public static void main(String[] s) { Thread t = new Thread() { public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("thread is running..."); } } }; t.start(); // Line A t = null; // Line B 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>
ガベージ コレクションを理解するメカニズム
スレッド t への参照は行 B で削除されますが、スレッドは「ガベージ コレクション ルート」とみなされているため、実行を続けます。ガベージ コレクターは、ルートを参照ポイントとして使用することによって、オブジェクトが到達可能かどうかを判断します。
実行中のスレッドはルートであるため、スレッド自体、および参照している他のオブジェクトがガベージ コレクションの対象から除外される可能性があります。これは、メイン スレッドの動作と類似していますが、メイン スレッドにも直接参照がないため、コレクションの対象にはなりません。
影響
この動作は、メモリ管理と潜在的な可能性に影響を及ぼします。メモリリーク。スレッドが無期限に使用されるように設計されている場合、アプリケーション コードからのスレッドの削除をガベージ コレクションのシグナルとして扱うべきではありません。メモリ使用量の分析とパフォーマンスの調整では、このようなシナリオを考慮することが重要です。
以上が実行中のスレッドはガベージ コレクションの対象になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。