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

时间:2010-01-20 13:11:41

标签: java jvm-arguments

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

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

4 个答案:

答案 0 :(得分:114)

经过大量搜索后,我发现的最佳解释来自Question of the month: 1.4.1 Garbage collection algorithms, January 29th, 2003

中的Java性能调优网站
  

年轻代垃圾收集算法

     

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

     

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

     

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

根据这些信息,似乎主要区别(除了CMS合作)是UseParallelGC支持ergonomics 而UseParNewGC不支持。{/ p>

答案 1 :(得分:18)

Parallel GC

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

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>

结论:

  1. 应用-XX:+ UseParallelGC,当您需要并行收集方法而 YOUNG 生成时,(仍然)使用序列标记 - 扫描方法为 OLD 生成集合
  2. YOUNG 生成时需要并行收集方法时应用-XX:+ UseParallelOldGC(自动设置-XX:+ UseParallelGC) AND OLD 世代收藏
  3. 申请-XX:+ UseParNewGC&amp; -XX:+ UseConcMarkSweepGC,当您需要并行收集方法而不是 YOUNG 生成时 AND 需要CMS方法作为 OLD 生成内存的集合
  4. 你不能同时应用-XX:+ UseParallelGC或-XX:+ UseParallelOldGC和-XX:+ UseConcMarkSweepGC,这就是为什么你需要-XX:+ UseParNewGC与CMS配对,否则使用-XX:+ UseSerialGC显式< strong> OR -XX: - 如果您希望对年轻一代使用串行方法,请使用UseParNewGC

答案 2 :(得分:15)

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

有关详细信息,请参阅问题22 Java GC FAQ

请注意,UseParNewGC

存在一些已知错误

答案 3 :(得分:3)

使用-XX:+ UseParNewGC和-XX:+ UseConcMarkSweepGC,与-XX:+ UseParallelGC相比,会对Minor GC造成更长的暂停时间。

这是因为,从Young到Old Generation的对象升级需要运行Best-Fit算法(由于旧代碎片)才能找到此对象的地址。
使用-XX:+ UseParallelGC时不需要运行这样的算法,因为+ UseParallelGC只能配置MarkandCompact Collector,在这种情况下没有碎片。