它们是年轻一代垃圾收集的算法。
第二个(UseParNewGC)使用并发的tenured generation垃圾收集自动激活(参见Java Concurrent and Parallel GC)但是,两个并行算法之间是否存在差异?
答案 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)
<强> 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>
结论:
答案 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,在这种情况下没有碎片。