web-dev-qa-db-ja.com

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

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

2つ目(UseParNewGC)は、同時期の世代別ガベージコレクションで自動的にアクティブになります( Java Concurrent and Parallel GC を参照)が、2つの並列アルゴリズムに違いはありますか?

80
fglez

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

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

(元の)コピーコレクター(デフォルトで有効)。このコレクターが起動すると、すべてのアプリケーションスレッドが停止し、1つのスレッドを使用してコレクションのコピーが進行します(マルチCPUマシン上であっても1つのCPUのみを意味します)。基本的に、JVMはコレクションが完了するまで他のすべてを一時停止するため、これは世界停止コレクションとして知られています。

パラレルコピーコレクター(-XX:+ UseParNewGCを使用して有効化)。元のコピーコレクターと同様に、これは世界のコレクターです。ただし、このコレクターは、複数のスレッドでコピーコレクションを並列化します。これは、マルチCPUマシンの元のシングルスレッドコピーコレクター(シングルCPUマシンではない)よりも効率的です。このアルゴリズムは、元のシングルスレッドコピーコレクターと比較した場合、使用可能なCPUの数に等しい係数で、若い世代のコレクションを潜在的に高速化します。

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

この情報から、主な違いは(CMSの協力とは別に)UseParallelGCは ergonomics をサポートするが、UseParNewGCはサポートしないことです。

116
fglez

並列GC

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

seParNewGC

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

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

<table border="1" style="width:100%">
  <tr>
    <td align="center">Young collector</td>
    <td align="center">Old collector</td>
    <td align="center">JVM option</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Serial Mark-Sweep-Compact</td>
    <td>-XX:+UseSerialGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Serial Mark-Sweep-Compact (PSOldGen)</td>
    <td>-XX:+UseParallelGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Parallel Mark-Sweep-Compact (ParOldGen)</td>
    <td>-XX:+UseParallelOldGC</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:-UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td>Parallel (ParNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:+UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td colspan="2">G1</td>
    <td>-XX:+UseG1GC</td>
  </tr>
</table>

結論:

  1. YOUNG世代以上の並列コレクションメソッドが必要な場合は、-XX:+ UseParallelGCを適用しますONLY、(but still )serial-mark-sweepメソッドをOLDgeneration collectionとして使用
  2. YOUNG世代以上の並列収集メソッドが必要な場合は、-XX:+ UseParallelOldGCを適用します(自動的に-XX:+ UseParallelGCを設定します)およびOLD生成コレクション
  3. YOUNG生成およびに並列コレクションメソッドが必要な場合、-XX:+ UseParNewGCおよび-XX:+ UseConcMarkSweepGCを適用します。 OLD世代メモリ上のコレクション
  4. -XX:+ UseParallelGCまたは-XX:+ UseParallelOldGCと-XX:+ UseConcMarkSweepGCを同時に適用することはできません。そのため、-XX:+ UseParNewGCをCMSとペアリングする必要があります。そうでない場合は、明示的に-XX:+ UseSerialGCを使用しますまたは -XX:-若い世代に対してシリアルメソッドを使用する場合はUseParNewGC
20
Ivan Herlambang

通常「Parallel Young Generation Collector」として知られるUseParNewGCは、より洗練された効率的な点を除き、すべての点でパラレルガベージコレクター(-XX:+ UseParallelGC)と同じです。また、「同時ローポーズコレクター」と併用することもできます。

Java GC FAQ 、質問22を参照してください。

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

15
Suraj Chandran

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

これは、若い世代から古い世代へのオブジェクトの昇格には、このオブジェクトのアドレスを見つけるために(旧世代のフラグメンテーションのため)ベストフィットアルゴリズムを実行する必要があるためです。
[。

3
Avinash Ganta