HotSpot VM GC收集器的合名问题

最近分析HotSpot VM GC日志,就各种收集器的名称搞晕掉了,幸好参考R大(RednaxelaFX )一些回复和文章。整理在此文,以方便自已日后查阅,也可让有需要的同学少走弯路,追本溯源,一切从DefNew的来因说起。

DefNew: 是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)

ParNew: 是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。

原本HotSpotVM里并没有并行GC,当时只有NewGeneration。新生代,老年代都使用串行回收收集。后来准备加入新生代并行GC,就把NewGeneration改名为DefNewGeneration,然后把新加的并行版叫做ParNewGeneration。

DefNewGeneration、ParNewGeneration都在Hotspot VM”分代式GC框架“内。但后来有个开发不愿意被这个框加憋着(证明了那句:所有壮举都不是在框架内产生的),自已硬写了个新的并行GC。测试后效果还不错。于是这个也放入VM的GC中。这就是我们现在看到的ParallelScavenge。

这个时候就出现个两个新生代的并行GC收集器:ParNewGeneration,ParallelScavenge。

(R大: Scavenge或者叫scavenging GC,其实就是copying GC的另一种叫法而已。HotSpot VM里的GC都是在minor GC收集器里用scavenging的,DefNew、ParNew和ParallelScavenge都是,只不过DefNew是串行的copying GC,而后两者是并行的copying GC。 由此名字就可以知道,“ParallelScavenge”的初衷就是把“scavenge”给并行化。换句话说就是把minor GC并行化。至于full GC,那不是当初关注的重点。 )

把GC并行化的目的是想提高GC速度,也就是提高吞吐量(throughput)。所以其实ParNew与ParallelScavenge都可叫做Throughput GC。 
但是在HotSpot VM的术语里“Throughput GC”通常特指“ParallelScavenge”

 

ParallelScavenge和ParNew都是并行GC,主要是并行收集young gen,目的和性能其实都差不多。最明显的区别有下面几点:

  1. ParallelScavenge以前是广度优先顺序来遍历对象图的,JDK6的时候改为默认用深度优先顺序遍历,并留有一个UseDepthFirstScavengeOrder参数来选择是用深度还是广度优先。在JDK6u18之后这个参数被去掉,ParallelScavenge变为只用深度优先遍历。ParNew则是一直都只用广度优先顺序来遍历。
  2. ParallelScavenge完整实现了adaptive size policy,而ParNew及“分代式GC框架”内的其它GC都没有实现(倒不是不能实现,就是麻烦+没人力资源去做)。所以千万千万别在用ParNew+CMS的组合下用UseAdaptiveSizePolicy,请只在使用UseParallelGC或UseParallelOldGC的时候用它。
  3. 由于在“分代式GC框架”内,ParNew可以跟CMS搭配使用,而ParallelScavenge不能。当时ParNew GC被从Exact VM移植到HotSpot VM的最大原因就是为了跟CMS搭配使用。
  4. 在ParallelScavenge成为主要的throughput GC之后,它还实现了针对NUMA的优化;而ParNew一  直没有得到NUMA优化的实现。

上面说ParallelScavenge并行收集young gen,那old/perm gen呢?

ParallelScavenge因为和其他几个GC不在一个框架内,最初的ParallelScavenge体系对老年代的回收拿的是“VM分代式框里的“  Serial Old收集器,改了接口,负责full GC,

命名为: PSMarkSweep(=“ParallelScavenge的MarkSweep”),其实就是串行收。

这里的ParallelScavenge已经不是Parallel Scavenge,而是一套GC框架体系。

为了名称下好区别,在这套体系时,新生代收集器叫:PSScavenge,这时的老年代收集器叫:PSMarkSweep。(PS看成是ParallelScavenge缩写,作为前缀)。

后来,因为未知的原因,老年代GC的并行化,没有在”分代式GC框架“中完成,而选择了在ParallelScavenge框架中。其成果就是使用了LISP2算法的并行版的full GC收集器,名为PSCompact(=“ParallelScavenge-MarkCompact”),收集整个GC堆。

当启用-XX:+UseParallelOldGC时,用的就是PSScavenge+PSCompact的组合。

当启用-XX:+UseParallelGC时,用的就是PSScavenge+ PSMarkSweep的组合。

(在Jconsole查看时,PSCompact、PSMarkSweep都显示为PSMarkSweep)。

Guest Author有一幅关于GC收集器的示意图:

黄色部分的用于新生代的收集器,紫灰色部分的用于老年代的收集器。连接表示两个可以配合使用。

你会发现分代式GC框架有收集器(Serial (就是DefNew),ParNew,CMS,MSC)可以任意搭配。而ParallelScavenge体系里的PSScavenge(图示中的ParallelScavenge),只能和其同一体系的Parallel Old搭配。

至于ParallelScavenge和Serial Old的连线,就是因为上文提到的PSMarkSweep,他是从“VM分代式框里的“  抽出来的Serial Old收集器,加了一层包装而已。

?号那个应该就是现在G1,他又是另一个体系框架内开发的,所以六亲不认。

时间: 2024-09-29 05:29:35

HotSpot VM GC收集器的合名问题的相关文章

深入JVM虚拟机(四) Java GC收集器

深入JVM虚拟机(四) Java GC收集器 1 GC收集器 1.1 Serial串行收集器 串行收集器主要有两个特点:第一,它仅仅使用单线程进行垃圾回收:第二,它独占式的垃圾回收. 在串行收集器进行垃圾回收时,Java 应用程序中的线程都需要暂停("StopThe World"),等待垃圾回收的完成,这样给用户体验造成较差效果.虽然如此,串行收集器却是一个成熟.经过长时间生产环境考验的极为高效的收集器.新生代串行处理器使用复制算法,实现相对简单,逻辑处理特别高效,且没有线程切换的开销

java虚拟机学习总结之GC回收算法与GC收集器

GC回收算法 1.标记清除算法分为标记阶段和清除阶段标记阶段:通过特定的判断方式找出无用的对象实例并将其标记清除阶段:将已标记的对象所占用的内存回收缺点:运行多次以后容易产生空间碎片,当需要一整段连续内存时虽然空间足够但是无法分配,会多次触发GC操作. 2.复制算法为了提高标记清除算法的效率,减少内存碎片的产生而出现的,该算法将内存空间分为两个完全相同的两部分,每次只使用其中的一部分.分为标记阶段.复制阶段和清除阶段标记阶段:同标记清除算法的标记阶段一致复制阶段:将为标记的对象全部复制到另一块未

[转]HotSpot VM GC 的种类

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037029.html collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent coll

HotSpot VM GC 的种类

collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent collector(concurrent low pause collector) 介绍 单线程收集器使用单线程去完成所有的gc工作,没有线程间的

HotSpot VM GC 的种类(转)

collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent collector(concurrent low pause collector) 介绍 单线程收集器使用单线程去完成所有的gc工作,没有线程间的

Java GC收集器配置说明

根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况下,JDK5.0以前都是使用串行收集器,如果需要使用其他收集器需要在启动的是时候加入相应的参数.JDK5.0以后,JVM会根据当前系统的配置进行判断. 我们先了解一下什么是并行和并发? 并行:指多条垃圾收集器线程并行工作,但此时仍是“Stop The World”状态,即用户线程处于等待状态: 并发

gc收集器选型

************************************************================================== jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.9 默认垃圾收集器G1 -XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集

GC收集器

①:Serial(串行)收集器 最基本,历史最悠久的串行收集器,单线程组赛队列,jdk1.5之前默认的收集器. 优点:简单高效,没有线程交互的开销. 缺点:单线程,只会使用一个cpu/一条收集线程去完成垃圾收集. 对应算法:年轻代复制算法,老年代标记整理算法. ②:ParNew收集器(Serial收集器的多线程版本) 多CPU时对系统资源利用率很好,默认开启的收集线程数与CPU相同,单CPU时Serial有更好的效果. ③:Paraller Scavenge 收集器 特点:并行,目标是达到一个可

Java Hotspot G1 GC的一些关键技术

G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生.在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248).在官网中,是这样描述G1的: The Garbage-First (G1) collector is a server-style garbage collector, targeted for