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

2022-08-31 11:08:03

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

第二个(UseParNewGC)通过并发永久生成垃圾回收自动激活(请参阅Java Concurrent和Parallel GC),但是,这两种并行算法之间有区别吗?


答案 1

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

年轻一代垃圾回收算法

(原始)复制收集器(默认启用)。当此收集器启动时,所有应用程序线程都将停止,并且复制集合将使用一个线程继续进行(这意味着即使在多 CPU 计算机上也只有一个 CPU)。这被称为停止世界集合,因为基本上JVM会暂停其他所有内容,直到收集完成。

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

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

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


答案 2

并行气相色谱

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

结论:

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

推荐