-XX:UseParallelGC和-XX:+ UseParNewGC之间的区别

fgl*_*lez 80 java jvm-arguments

它们是年轻一代垃圾收集的算法.

第二个(UseParNewGC)通过并发tenured generation垃圾收集自动激活(参见Java Concurrent and Parallel GC),但两个并行算法之间是否存在差异?

fgl*_*lez 117

经过大量的搜索,我发现的最佳解释是来自本月问题的 Java性能调优网站:1.4.1垃圾收集算法,2003年1月29日

年轻一代垃圾收集算法

(原)复制收集器(默认启用).当这个收集器启动时,所有应用程序线程都会停止,并且使用一个线程(即使在多CPU机器上只有一个CPU)进行复制收集.这被称为stop-the-world集合,因为基本上JVM会暂停其他所有内容,直到集合完成.

并行复制收集(使用-XX启用:+ UseParNewGC).就像原始的复制收藏家一样,这是一个世界级的收藏家.然而,这集电极并行化复制收集在多个线程,这是比原来的单螺纹复制收集器,用于多CPU的机器更有效(尽管不是用于单CPU的机器).与原始的单线程复制收集器相比,此算法可能会使年轻代收集的速度等于可用CPU数量.

平行扫集电极(启用使用-XX:UseParallelGC).这就像之前的并行复制收集器一样,但算法在多CPU机器上针对千兆字节堆(超过10GB)进行了调整.此收集算法旨在最大化吞吐量,同时最大限度地减少暂停.它有一个可选的自适应调整策略,它将自动调整堆空间的大小.如果你使用这个收藏家,你只能使用老一代的原始标记-清除收集器(即新老一代并发收集器无法与这个年轻一代收藏家工作).

根据这些信息,似乎主要区别(除了CMS合作)是UseParallelGC支持人体工程学,而UseParNewGC则不支持.

  • 稍微更新一点链接http://www.fasterj.com/articles/oraclecollectors1.shtml (3认同)

Iva*_*ang 20

并行GC

  • XX:+ UseParallelGC使用并行垃圾收集进行清除.(在1.4.1中引入)
  • XX:+ UseParallelOldGC对完整集合使用并行垃圾回收.启用此选项会自动设置-XX:+ UseParallelGC.(在5.0更新中引入6.)

UseParNewGC

UseParNewGC 年轻代复制收集器的并行版本与并发收集器一起使用(即,如果在命令行上使用-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>
Run Code Online (Sandbox Code Playgroud)

结论:

  1. 应用-XX:+ UseParallelGC当你需要在并行采集方法YOUNGONLY,(仍然)使用串行标记-清除方法,一代收藏
  2. 当你需要在YOUNG生成(自动设置-XX:+ UseParallelGC) OLD生成集合的并行收集方法时应用-XX:+ UseParallelOldGC
  3. 应用-XX:+ UseParNewGC&-XX:+ UseConcMarkSweepGC,当您需要在YOUNG生成上进行并行收集方法时,需要使用CMS方法作为OLD生成内存的集合
  4. 你不能同时应用-XX:+ UseParallelGC或-XX:+ UseParallelOldGC和-XX:+ UseConcMarkSweepGC,这就是为什么你需要-XX:+ UseParNewGC与CMS配对,否则使用-XX:+ UseSerialGC显式OR -XX:-如果您希望对年轻一代使用串行方法,请使用UseNearGC


Sur*_*ran 15

UseParNewGC通常知道"并行年轻代收集器"在各方面都与并行垃圾收集器(-XX:+ UseParallelGC)相同,除了它更复杂和高效.它也可以与"并发低暂停收集器"一起使用.

有关更多信息,请参阅Java GC FAQ,问题22.

请注意,UseParNewGC存在一些已知错误

  • 你知道哪些已知错误或哪些JVM版本有它们? (8认同)