Java同時および並列GC
-
03-07-2019 - |
質問
この記事こちらでは、 -XX:+ UseParNewGC
"並行GCで並列若い世代のGCを有効にするために"。
混乱は、並列GCと同時GCの両方を有効にするには、
-
-XX:+ UseParNewGC
または を使用
-
-XX:+ UseParNewGC
と-XX:+ UseConcMarkSweepGC
の両方を使用しますか?
PS
JVM 6を使用しています
解決
リンクしたドキュメントは1.4.2 VMに関するものだったので、これを使用していると仮定します(JVM 5と6は異なる動作をします)。
http://java.sun.com/docs/hotspot/gc1から。 4.2 /
if -XX:+ UseConcMarkSweepGCが使用されている場合 コマンドライン、次にフラグ UseParNewGCもtrueに設定されます 明示的に設定されていない コマンドライン
したがって、答えは、-XX:+ UseConcMarkSweepGCを使用するだけでよく、並列コレクターと並列の若い世代のコレクターを有効にします。
編集:Java 6の場合、同じフラグ(-XX:+ UseConcMarkSweepGC)が並行コレクターを有効にします。必要なコレクターの選択はいくつかの事項に依存するため、異なる構成をテストする必要があります。ただし、非常に一般的なガイドラインがいくつかあります。シングルプロセッサ、シングルスレッドマシンを使用している場合は、シリアルコレクターを使用する必要があります(一部の構成のデフォルトは、-XX:+ UseSerialGCで明示的に有効にできます)。ワークロードが基本的にCPUバウンドであるマルチプロセッサマシンの場合、パラレルコレクタを使用します。これは、-serverフラグを使用するとデフォルトで有効になりますが、-XX:+ UseParallelGCを使用して明示的に有効にすることもできます。 GCの合計CPU時間の使用を犠牲にしてGCの一時停止を短くし、CPUが複数ある場合は、同時コレクター(-XX:+ UseConcMarkSweepGC)を使用できます。メモリの断片化が発生する可能性があるため、コンカレントコレクターは、特定のワークロードのシリアルまたはパラレルコレクターよりも多くのRAMをJVMに割り当てる傾向があることに注意してください。
他のヒント
java / JDK 6 GCチューニング: http: //www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 。これは、SUN(現在のOracle)からです。完全なもの。
また、
を参照
http://kirk.blog-city.com/is_your_concurrent_collector_failing_you.htm
http://www.javaperformancetuning.com/
このブログエントリには、さまざまなコレクターの詳細な内訳があり、有効なオプションは次のとおりです。 http ://blogs.oracle.com/jonthecollector/entry/our_collectors
Java GCのチューニングは基本的に暗い芸術ですが、私のアプリケーション(50 + GBのヒープと16の物理コアで実行)では、ConcMarkSweepコレクターは-serverデフォルトの3倍、2.2倍の高速化になりましたParallelOldGC。
マシンを他のプロセスと共有していない(つまり、アイドル状態のコアが無駄になっている)場合は、ConcMarkSweepGCを使用します。
ParNewは、CMSを使用する場合のデフォルトの若い世代のコレクタです。CMSを使用するには、-XX:+ UseConcMarkSweepGCを指定するだけで、ParNewがデフォルトで使用されます。 GCジッターの回避が優先される場合、CMSは優れたコレクターですが、たとえば、ジョブのようなバッチでスループットがより重要な場合、デフォルトのSUNパラレルコレクターがより良いジョブを実行します。
2つのGCオプションを同時に有効にすることはできません。 UseParNewGCよりも次世代GCよりも優れたCMSを使用することをお勧めします。 Java 1.7以降を使用していて、ヒープサイズが比較的大きい場合(> 4GBなど)、G1の使用を検討してください。