ParallelGC和ParallelOldGC之间有什么区别?

时间:2011-06-04 12:24:47

标签: java jvm jvm-arguments

我对GC算法有一些疑问: 首先,当我们使用UseSerialGC,UseParallelGC,UseParallelOldGC等参数时,我们指定一个GC算法。他们每个人都可以在所有一代做GC,是不是?

例如,如果我使用“java -XX:+ UseSerialGC”,则所有代都将使用串行GC作为GC算法。

第二,我可以在Old Gneneration中使用ParallelGC并在yong一代中使用SerialGC吗?

最后作为标题ParallelGC和ParallelOldGC之间有什么区别?

4 个答案:

答案 0 :(得分:18)

查看HotSpot VM Options

-XX:+ UseParallelGC =使用并行垃圾收集进行清除。 (在1.4.1中引入)。

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

其中Scavenges = Young generation GC。

答案 1 :(得分:7)

好吧,经过大量的搜索和研究,我逐渐了解到以下内容,

-XX:+ UseParallelGC -这使GC可以在年轻一代中使用多线程,但对于老一代/老一代仍然使用序列标记和紧凑算法。

-XX:+ UseParallelOldGC -这使GC能够在旧/保有世代中使用 Parallel Mark and Compact 算法。

让我们理解-

年轻一代中起作用的算法和内存安排,例如标记和副本,交换空间,由于许多原因不适用于老一代

>

低死亡率-在老一代中,“死亡率”显着低于年轻一代。在典型的Java应用程序中,大多数对象会迅速死亡,并且寿命更长。作为能够在年轻世代中生存并晋升为老一代的物体,可以观察到这些物体倾向于寿命更长。与年轻一代相比,老年一代的死亡率要低得多。

大小显着-老一代比老一代大很多。由于年轻一代很快就会清理干净,因此许多短期对象(小的年轻一代)的可用空间相对较小。在老一代中,对象会随着时间而积累。因此,老一代的空间一定要比年轻一代的大得多。

分配很少-与上一代相比,上一代的分配较少。这是因为在旧世代中,只有当垃圾收集器将尚存的物体从年轻一代升级到旧世代时,对象才会出现。另一方面,在“年轻一代”中,应用程序使用新生成的所有对象(即大部分分配)都出现在“年轻一代”中。

考虑到这些差异,为年轻一代选择了一种算法,该算法将尽快完成垃圾收集,因为死亡率很高,因此必须经常调用该算法。 (1)]。另外,该算法必须确保最有效的内存分配[点(3)]成为可能,因为在Young Generation中分配了很多内存。年轻一代的标记和复制算法具有这些特性。

另一方面,该算法在“旧一代”中没有意义。情况有所不同:垃圾收集器必须处理旧一代中的许多对象(第(2)点),其中大多数仍然存在。只有一小部分变得无法到达并可以释放[点(1)]。如果垃圾收集器像标记复制一样在每个垃圾收集上复制所有尚存的对象,那么它将花费大量时间来复制它而不会获得太多收益。

因此标记扫掠算法是在较老的一代中实现的,该算法不会复制任何内容,而只会释放不可达的对象。由于此算法会导致堆碎片,因此,人们还考虑了标记清除算法的一种变体,其中在扫描阶段之后进行压缩,通过该压缩,碎片降低了。这种算法称为 mark-and-compact 算法。

标记和紧凑算法可能很耗时,因为它需要在随后的阶段中遍历对象图。

  1. 标记。
  2. 计算新位置。
  3. 参考调整。
  4. 移动

计算新位置阶段,只要有可用空间,便会尝试找到可以移动到该空间的对象(<碎片整理)。存储该对以便在以后的阶段中使用。这会导致算法消耗更多时间。

标记和比较虽然解决了终身制的某些特定问题,但由于这是一次STW(停止世界)事件,并且花费大量时间,可能会严重影响应用程序,因此存在一些严重问题。

上一代的替代算法

为了减少中断时间,已经考虑了串行标记和压缩算法的替代方案:

并行标记和压缩算法,该算法仍然锁存所有应用程序线程,但随后使用多个垃圾收集器线程处理标记和后续压缩。尽管这仍然是世界末日的方法,但是在多核或多处理器计算机上产生的暂停比串行标记紧凑算法要短。自Java 5 Update 6起,这种旧一代的并行算法(称为“ ParallelOld”)就已经可用,并且可以通过选项 -XX:+ UseParallelOldGC 进行选择。

一种竞争性的标记扫描算法,至少可以在不停止其线程的情况下与应用程序部分竞争,并且偶尔需要短暂的停止世界阶段。从Java 1.4.1开始,这种并发的标记扫掠算法(称为“ CMS”)就存在了。使用选项-XX:+ UseConcMarkSweepGC将其打开。重要的是,这只是标记扫频算法;压缩不会发生,从而导致已经讨论的碎片问题。

因此,简而言之 -XX:+ UseParallelOldGC 用作在使用 Mark and Compact 算法进行主要收集时使用多个线程的指示。如果改用此选项,则次要或年轻集合是并行的,但主要集合仍是单线程的。

我希望这个答案。

答案 2 :(得分:1)

这些是应用于Java堆的不同区域的两个gc策略,即新旧代。这是一个有助于澄清哪些选项意味着其他选项的链接。它非常有用,特别是在您开始了解您在指定ParallelOldGC或ParNewGC时获得的内容时。     http://www.fasterj.com/articles/oraclecollectors1.shtml

答案 3 :(得分:0)

从Oracle Java SE 8文档:

  

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

     

并行收集器(也称为吞吐量收集器)并行执行次要收集,这可以大大减少垃圾收集的开销。它适用于具有在多处理器或多线程硬件上运行的中型到大型数据集的应用程序。在某些硬件和操作系统配置上,并行收集器默认为选中状态,或者可以通过选项-XX:+ UseParallelGC显式启用。

     

并行压缩是一项使并行收集器能够并行执行主要收集的功能。如果没有并行压缩,则使用单个线程执行主要集合,这会大大限制可伸缩性。如果已指定选项-XX:+ UseParallelGC,则默认情况下启用并行压缩。关闭它的选项是-XX:-UseParallelOldGC。

因此,如果您指定-XX:+ UseParallelGC,则默认情况下,也将使用多个线程来完成主要集合。反之亦然,即,如果您指定-XX:+ UseParallelOldGC,次集合也将使用多个线程来完成。