-XX:+ UseParallelGCと-XX:+ UseParNewGCの違い


82

これらは、若い世代のガベージコレクションのアルゴリズムです。

2番目のもの(UseParNewGC)は、同時保有期間生成ガベージコレクション(Java同時および並列GCを参照)で自動的にアクティブ化されますが、2つの並列アルゴリズムに違いはありますか?

回答:


119

多くの検索の結果、私が見つけた最も良い説明は、今月の質問のJava Performance Tuning Webサイトからのものです。1.4.1ガベージコレクションアルゴリズム、2003年1月29日

若い世代のガベージコレクションアルゴリズム

(オリジナル)のコピーコレクタ(デフォルトは有効)。このコレクターが起動すると、すべてのアプリケーションスレッドが停止し、コピーコレクションは1つのスレッドを使用して続行されます(つまり、マルチCPUマシン上でも1つのCPUのみ)。基本的に、JVMはコレクションが完了するまで他のすべてを一時停止するため、これはストップザワールドコレクションと呼ばれます。

並列コピーコレクター(-XX用い有効:+ UseParNewGC)。オリジナルのコピーコレクターのように、これは世界を止めるコレクターです。ただし、このコレクターは、コピーコレクションを複数のスレッドに並列化します。これは、マルチCPUマシンの元のシングルスレッドコピーコレクターよりも効率的です(ただし、シングルCPUマシンの場合はそうではありません)。このアルゴリズムは、元のシングルスレッドのコピーコレクターと比較した場合、使用可能なCPUの数に等しい係数で若い世代のコレクションを高速化する可能性があります。

平行掃気コレクタ(:UseParallelGC -XXを使用して有効)。これは以前の並列コピーコレクターと似ていますが、アルゴリズムはマルチCPUマシン上のギガバイトヒープ(10GB以上)用に調整されています。この収集アルゴリズムは、一時停止を最小限に抑えながらスループットを最大化するように設計されています。ヒープスペースのサイズを自動的に変更するオプションのアダプティブチューニングポリシーがあります。このコレクターを使用する場合、古い世代の元のマークスイープコレクターのみを使用できます(つまり、新しい古い世代の同時コレクターは、この若い世代のコレクターと連携できません)。

この情報から、(CMSの協力を除いて)主な違いは、UseParallelGCは人間工学をサポートしているのに対し、UseParNewGCはサポートしていないことです。


3
少しより多くの最新リンクにfasterj.com/articles/oraclecollectors1.shtml
phunehehe

@phuneheheリンクをありがとう!とても助かります。
学生の魂

21

パラレルGC

  • XX:+ UseParallelGCスカベンジに並列ガベージコレクションを使用します。(1.4.1で導入)
  • XX:+ UseParallelOldGC完全なコレクションに並列ガベージコレクションを使用します。このオプションを有効にすると、-XX:+ UseParallelGCが自動的に設定されます。(5.0アップデート6で導入されました。)

UseParNewGC

UseParNewGC 若い世代のコピーコレクターの並列バージョンがコンカレントコレクターで使用されます(つまり、コマンドラインで-XX:+ UseConcMarkSweepGCが使用されている場合、コマンドラインで明示的に設定されていない場合はフラグUseParNewGCもtrueに設定されます)。

おそらく、理解する最も簡単な方法は、AlexeyRagozinによって作成されたガベージコレクションアルゴリズムの組み合わせでした。

結論:

  1. YOUNG世代のみで並列収集メソッドが必要な場合は、-XX:+ UseParallelGCを適用します。ただしOLD世代コレクションとしてserial-mark-sweepメソッドを使用します。
  2. YOUNG世代(-XX:+ UseParallelGCを自動的に設定) OLD世代のコレクションで並列収集方法が必要な場合は、-XX:+ UseParallelOldGCを適用します
  3. 適用-XX:+ UseParNewGC&-XX:+ UseConcMarkSweepGCを使用すると、オーバーパラレル収集方法が必要です若い世代をオーバーあなたのコレクションとしてCMSの方法を必要とOLD世代のメモリ
  4. 同時に+ UseConcMarkSweepGCを、あなたは-XX必要が理由ですその:+ UseParallelGCまたは-XX:-XX:+とUseParallelOldGCあなたは-XXを適用することはできませんCMSとペアにされる+ UseParNewGCをそれ以外の場合は-XXを使用:+明示的UseSerialGC OR -XX:-若い世代に対してシリアルメソッドを使用する場合は、ParNewGCを使用します

である必要があります-XX:-UseParallelGC
ミナスミナ

注:結論#1はもう正しくありません。-XX:+UseParallelGCリードを適用して、最新のJVMの若いGCと古いGCの両方に並列GCを使用します。参照してくださいbugs.openjdk.java.net/browse/...
turbanoff

15

通常「並列若い世代コレクター」として知られているUseParNewGCは、より洗練された効率的な点を除いて、並列ガベージコレクター(-XX:+ UseParallelGC)とすべての点で同じです。また、「コンカレントローポーズコレクター」と併用することもできます。

詳細については、Java GC FAQ、質問22を参照してください。

UseParNewGCにはいくつかの既知のバグがあることに注意してください


8
どの既知のバグまたはどのJVMバージョンにそれらがあるか知っていますか?
fglez 2010年

4

-XX:+ UseParNewGCを-XX:+ UseConcMarkSweepGCと一緒に使用すると、-XX:+ UseParallelGCと比較して、マイナーGCの一時停止時間が長くなります。

これは、オブジェクトを若い世代から古い世代に昇格させるには、このオブジェクトのアドレスを見つけるために(古い世代の断片化のために)Best-Fitアルゴリズムを実行する必要があるためです。
+ UseParallelGCはMarkandCompact Collectorでのみ構成できるため、-XX:+ UseParallelGCを使用する場合は、このようなアルゴリズムを実行する必要はありません。この場合、断片化は発生しません。


これは本当に良い洞察です。それを確認するためにテストを実行しましたか?
fglez 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.