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

他们是年轻一代垃圾收集的algorithm。

第二个(UseParNewGC)通过并发生成的垃圾收集(请参见Java并发和并行GC )自动激活,但两种并行algorithm之间是否有区别?

经过大量的search,我发现最好的解释是从Java Performance Tuning网站的月份问题:1.4.1垃圾收集algorithm,2003年1月29日

年轻一代的垃圾收集algorithm

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

并行复制收集器 (使用-XX:+ UseParNewGC启用)。 像原来的复制collections家一样,这是一个世界级的collections家。 然而,这个收集器在多个线程上并行复制收集,这比多CPU机器的原始单线程复制收集器(尽pipe不是用于单CPU机器)更有效率。 与原来的单线程复制收集器相比,该algorithm有可能将年轻一代的收集速度提高一个等于可用CPU数量的因子。

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

从这些信息看来,主要区别(除了CMS合作),UseParallelGC支持人体工程学,而UseParNewGC则不支持。

UseParNewGC通常认为“平行年轻代收集器”在并行垃圾收集器(-XX:+ UseParallelGC)方面是一样的,除了它更加高超和高效。 它也可以用于“并发低收集器”。

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

请注意,UseParNewGC有一些已知的错误

并行GC

  • XX:+ UseParallelGC使用并行垃圾收集进行清理。 (在1.4.1中介绍)
  • XX:+ UseParallelOldGC为整个集合使用并行垃圾收集。 启用此选项会自动设置-XX:+ UseParallelGC。 (在5.0更新6中引入)

UseParNewGC

UseParNewGC年轻一代复制收集器的并行版本与并发收集器一起使用(即,如果在命令行上使用了-XX:+ UseConcMarkSweepGC,那么如果在命令行中未明确设置标志UseParNewGC,也将其设置为true )。

也许最容易理解的方法是由Alexey Ragozin制作的垃圾收集algorithm的组合

<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> 

与-XX:+ UseParallelGC相比,使用-XX:+ UseParNewGC和-XX:+ UseConcMarkSweepGC会导致次GC的暂停时间更长。

这是因为,从年轻人到老一代的对象推广将需要运行最佳适合algorithm(由于旧一代碎片)find这个对象的地址。
当使用-XX:+ UseParallelGC时,不需要运行这样的algorithm,因为+ UseParallelGC只能用MarkandCompact收集器configuration,在这种情况下没有碎片。