一般に (Oracle/sun および MS のような他のサード パーティからの標準 JVM 実装があることを認識しているため)、JVM は、ガベージ オブジェクトを収集するデーモンとして実行されるガベージ コレクション スレッドを 1 つだけ作成しますか、または JVM は複数のスレッドを生成しますか?ガベージコレクションを達成するための1つのスレッド?
3 に答える
で有効化され、デフォルトのコレクターである「スループットコレクター」-XX:+UseParallelGC
は、複数のスレッドを使用します。で有効化された「同時低ポーズ コレクター」-XX:+UseConcMarkSweepGC
は、同時コレクターに 1 つのスレッドを使用しますが、そのストップ ザ ワールド コレクションは並列です。
めったに使用されないシングル スレッド GC だけ-XX:+UseSerialGC
がシングル スレッドです。
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
-XX:ConcGCThreads=n -- 並行ガベージ コレクタが使用するスレッドの数。デフォルト値は、JVM が実行されているプラットフォームによって異なります。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
より多くのガベージ コレクター スレッドが存在する可能性がありますが、それらの数、実行シーケンスなどに依存するべきではありません。ただし、信頼できる重要なものがあります。例: Object.finalize()は一度だけ呼び出されます。
質問については、ガベージコレクタのチューニングもチェックしてください。
Oracle の Garbage-First GC アルゴリズム (Java 8 で使用可能で、Java 9 のデフォルト オプション) は並列/同時 GC アルゴリズムであるため、複数のスレッドが関与します。具体的には、ガベージ コレクションに使用されるスレッドがいくつかあります。
- ParallelGC Threads は、「stop the world」コレクション フェーズで使用されるスレッドです。
- 並列マーキング スレッド (または同時 GC スレッド) は、領域をクリーンアップの候補としてマークし、アプリケーション スレッドを停止せずに実行するために使用されるスレッドです。
- G1 コンカレント リファインメント スレッドは、個々のリージョンの記憶された参照セットへの変更をマークする責任があります。
G1GC は設定によって有効にすることができます-XX:+UseG1GC
(その時点で Java 7 G1GC で利用可能でしたが、信頼性が低いため、本番環境では使用しないでください (Java 7 はサポートが終了しているため、本番環境では使用しないでください)。また))。
ソースhttps://blogs.oracle.com/g1gc/entry/g1gc_faqおよびhttp://www.oracle.com/technetwork/articles/java/g1gc-1984535.html