它们是针对年轻代垃圾回收的算法。
第二种算法(UseParNewGC)会随着并发老年代垃圾回收(参见Java Concurrent and Parallel GC)自动激活,但两个并行算法之间有什么区别呢?
它们是针对年轻代垃圾回收的算法。
第二种算法(UseParNewGC)会随着并发老年代垃圾回收(参见Java Concurrent and Parallel GC)自动激活,但两个并行算法之间有什么区别呢?
经过大量搜索,我发现最好的解释来自Java性能调整网站中的问题月刊:1.4.1垃圾回收算法,2003年1月29日
年轻代垃圾回收算法
(原始)复制收集器(默认启用)。当此收集器启动时,所有应用程序线程都会停止,并且使用一个线程进行复制收集(这意味着即使在多CPU机器上也只有一个CPU)。这被称为全停顿集合,因为基本上JVM暂停了除收集完成外的所有内容。
并行复制收集器(使用-XX:+UseParNewGC启用)。与原始复制收集器类似,这是一个全停顿收集器。然而,该收集器将复制收集并行化到多个线程上,对于多CPU机器而言比原始单线程复制收集器更有效率(但对于单CPU机器则不是)。与原始单线程复制收集器相比,该算法可能将年轻代收集速度提高了等于可用CPU数量的因子。
并行清理收集器(使用-XX:UseParallelGC启用)。这类似于前面的并行复制收集器,但该算法针对多CPU机器上的千兆字节堆(超过10GB)进行了调整。该收集算法旨在最大化吞吐量并最小化暂停时间。它具有可选的自适应调整策略,可以自动调整堆空间大小。如果使用此收集器,则只能在老年代中使用原始标记清除收集器(即较新的老年代并发收集器不能与此年轻代收集器一起使用)。
从这些信息来看,主要区别(除了CMS合作外)似乎是UseParallelGC支持人体工程学而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>
结论:
-XX:-UseParallelGC
。 - Minas MinaUseParNewGC通常被称为“并行年轻代收集器”,在所有方面都与并行垃圾回收器(-XX:+ UseParallelGC)相同,但其更为复杂和高效。此外,它可以与“并发低暂停收集器”一起使用。
有关更多信息,请参见Java GC FAQ的第22个问题。
请注意,目前已知UseParNewGC存在一些已知的错误。
我将尝试使用Oracle官方文档来回答这个问题:
-XX:+UseParallelGC
是并行收集器,而-XX:+UseParNewGC
是并发年轻代收集器。默认情况下,此选项已禁用,并且当设置-XX: + UseConcMarkSweepGC选项时,它会自动启用。在JDK 8中,使用-XX: + UseParNewGC选项而不使用-XX: + UseConcMarkSweepGC选项已被弃用。