-XX: UseParallelGC 和 -XX: UseParNewGC 的区别

新手上路,请多包涵

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

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

原文由 fglez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 966
2 个回答

经过大量搜索,我找到的最佳解释来自 本月问题中的 Java Performance Tuning 网站:1.4.1 垃圾收集算法,2003 年 1 月 29 日

年轻代垃圾回收算法

_(原始)复印收集器_(默认启用)。当这个收集器启动时,所有应用程序线程都停止,复制收集使用一个线程进行(这意味着即使在多 CPU 机器上也只有一个 CPU)。这称为 stop-the-world 收集,因为基本上 JVM 会暂停其他所有操作,直到收集完成。

_并行复制收集器_(使用 -XX:+UseParNewGC 启用)。就像原始的复制收藏家一样,这是一个停止世界的收藏家。然而,这个收集器将复制收集并行化到多个线程上,这比用于多 CPU 机器(尽管不适用于单 CPU 机器)的原始单线程复制收集器更有效。与原始的单线程复制收集器相比,该算法可能会以等于可用 CPU 数量的因子加速年轻代收集。

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

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

原文由 fglez 发布,翻译遵循 CC BY-SA 4.0 许可协议

并行GC

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

使用ParNewGC

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 ,( 仍然)使用串行标记扫描方法作为 一代收集
  2. 当你需要在 YOUNG 代(自动设置 -XX:+UseParallelGC) OLD 代收集上使用并行收集方法时,应用 -XX:+UseParallelOldGC
  3. 应用 -XX:+UseParNewGC 和 -XX:+UseConcMarkSweepGC 当你需要在 YOUNG 代上使用并行收集方法 并且 需要 CMS 方法作为你在 OLD 代内存上的收集
  4. 您不能将 -XX:+UseParallelGC 或 -XX:+UseParallelOldGC 与 -XX:+UseConcMarkSweepGC 同时应用,这就是为什么您需要 -XX:+UseParNewGC 与 CMS 配对,否则显式使用 -XX:+UseSerialGC -XX: - 如果你想对年轻一代使用串行方法,请使用 ParNewGC

原文由 Ivan Herlambang 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题