代码之家  ›  专栏  ›  技术社区  ›  fglez

-xx:useParallelGC和-xx之间的差异:+useParNewGC

  •  78
  • fglez  · 技术社区  · 15 年前

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

    第二个(useparnewgc)通过并发的持久生成垃圾收集自动激活(请参见 Java Concurrent and Parallel GC )但是,这两种并行算法之间有区别吗?

    4 回复  |  直到 7 年前
        1
  •  113
  •   Chris Huang-Leaver    11 年前

    经过大量的搜索,我从Java性能优化网站中找到了最好的解释。 Question of the month: 1.4.1 Garbage collection algorithms, January 29th, 2003

    年轻一代垃圾收集算法

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

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

    这个 并联扫气收集器 (使用-xx:useParallelGC启用)。这与以前的并行复制收集器类似,但算法针对多CPU计算机上的千兆字节堆(超过10GB)进行了优化。此收集算法旨在最大化吞吐量,同时最小化暂停。它有一个可选的自适应调整策略,可以自动调整堆空间的大小。如果使用此收集器,则只能使用旧一代中的原始标记扫描收集器(即,较新的旧一代并发收集器不能与此新一代收集器一起工作)。

    从这些信息来看,主要的区别(除了CMS合作)似乎是useParallelGC支持 ergonomics 虽然useparnewgc没有。

        2
  •  16
  •   Ivan Herlambang    9 年前

    Parallel GC

    • xx:+useParallelGC使用并行垃圾收集进行清理。(1.4.1中介绍)
    • xx:+useParallelOldgc对完整集合使用并行垃圾收集。启用此选项会自动设置-xx:+useParallelGC。(在5.0更新6中介绍。)

    UseParNewGC

    使用PaleNexGC 使用了年轻一代复制收集器的并行版本 对于并发收集器(即,如果-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. 应用-xx:+useParallelOldGC当您需要并行收集方法 年轻的 生成(自动设置-xx:+useParallelGC) 旧的 生成集合
    3. 应用-xx:+useparnewgc&-xx:+useconcmarkswepgc当您需要并行收集方法超过 年轻的 一代 收集结束时需要CMS方法 旧的 生成存储器
    4. 您不能同时应用-xx:+useParallelGC或-xx:+useParallelOldGC和-xx:+useConcMarkSweepGC,这就是为什么您需要-xx:+useParNewGC与CMS配对,否则显式使用-xx:+useSerialGC - XX: - 如果要对年轻一代使用串行方法,请使用parnewgc
        3
  •  15
  •   Wilfred Hughes AntuanSoft    10 年前

    useparnewgc通常被称为“并行年轻一代收集器”,在所有方面都与并行垃圾收集器(-xx:+useparallelgc)相同,只是它更为复杂和有效。它还可以与“并发低暂停收集器”一起使用。

    Java GC FAQ ,问题22了解更多信息。

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

        4
  •  3
  •   Avinash Ganta    10 年前

    使用-xx:+useparnewgc和-xx:+useconcmarkswepgc与-xx:+useparallelgc相比,将导致次要gc的暂停时间更长。

    这是因为,将对象从年轻一代提升到老年一代需要运行一个最适合的算法(由于旧一代的碎片)来找到该对象的地址。
    当使用-xx:+useParallelGC时,不需要运行这样的算法,因为+useParallelGC只能使用MarkandCompact Collector进行配置,在这种情况下没有碎片。

    推荐文章