来源:https://hllvm-group.iteye.com/group/topic/27629
- jdk1.6 使用
-XX:+UseParallelGC
参数:年轻代使用Parallel Scavenge收集器 + 老年代PS MarkSweep (其实跟Serial old共用同一份代码),所以现在很多文章,都是直接写-XX:+UseParallelGC
是Parallel Scavenge + Serial old
。 - jdk1.7+ 使用
-XX:+UseParallelGC
参数:年轻代使用Parallel Scavenge收集器 + 老年代Parallel Old收集器
《深入理解java虚拟机》
R大的解答在Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集,但由于PS MarkSweep与Serial Old实现非常接近,因此官方的许多资料都直接以Serial Old代替PS MarkSweep进行讲解。
其实是这样:链接所引用的那篇文章里的图是个简化的示意图,实际上在HotSpot VM内因为历史原因情况稍微复杂一些。
HotSpot VM里多个GC有部分共享的代码。有一个分代式GC框架,Serial/Serial Old/ParNew/CMS都在这个框架内;在该框架内的young collector和old collector可以任意搭配使用,所谓的“mix-and-match”。
而ParallelScavenge与G1则不在这个框架内,而是各自采用了自己特别的框架。这是因为新的GC实现时发现原本的分代式GC框架用起来不顺手。请参考官方文档的Collector Styles一段。
ParallelScavenge(PS)的young collector就如其名字所示,是并行的拷贝式收集器。本来这个young collector就是“Parallel Scavenge”所指,但因为它不兼容原本的分代式GC框架,为了凸显出它是不同的,所以它的young collector带上了PS前缀,全名变成PS Scavenge。对应的,它的old collector的名字也带上了PS前缀,叫做PS MarkSweep。
这个PS MarkSweep默认的实现实际上是一层皮,它底下真正做mark-sweep-compact工作的代码是跟分代式GC框架里的serial old(这个collector名字叫做MarkSweepCompact)是共用同一份代码的。也就是说实际上PS MarkSweep与MarkSweepCompact在HotSpot VM里是同一个collector实现,包了两张不同的皮;这个collector是串行的。
在顶楼链接里的那帖就是基于这个事实,而将两者简单的一并描述为“serial old”。
能与PS系兼容的并行old collector可以通过-XX:+UseParallelOldGC来开启,但(不幸的是)它的collector名字显示出来也是PS MarkSweep。
还有这种代码增添混乱程度:
inline const char* PSOldGen::select_name() {
return UseParallelOldGC ? "ParOldGen" : "PSOldGen";
}
网友评论