PS MarkSweep 和Serial Old 的区别

2020-07-12  本文已影响0人  我要进大厂

来源:https://hllvm-group.iteye.com/group/topic/27629

《深入理解java虚拟机》

在Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集,但由于PS MarkSweep与Serial Old实现非常接近,因此官方的许多资料都直接以Serial Old代替PS MarkSweep进行讲解。

R大的解答

其实是这样:链接所引用的那篇文章里的图是个简化的示意图,实际上在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";  
}  
上一篇下一篇

猜你喜欢

热点阅读