美文网首页
PS MarkSweep 和Serial Old 的区别

PS MarkSweep 和Serial Old 的区别

作者: 我要进大厂 | 来源:发表于2020-07-12 10:11 被阅读0次

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

    • jdk1.6 使用 -XX:+UseParallelGC 参数:年轻代使用Parallel Scavenge收集器 + 老年代PS MarkSweep (其实跟Serial old共用同一份代码),所以现在很多文章,都是直接写-XX:+UseParallelGCParallel Scavenge + Serial old
    • jdk1.7+ 使用-XX:+UseParallelGC 参数:年轻代使用Parallel Scavenge收集器 + 老年代Parallel Old收集器

    《深入理解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";  
    }  
    

    相关文章

      网友评论

          本文标题:PS MarkSweep 和Serial Old 的区别

          本文链接:https://www.haomeiwen.com/subject/kyrgcktx.html