在学习JVM各种GC的过程中,翻看了不少文章,其中一篇文章的评论区的一个问题引起了我的注意,最终解答后准备记录一下这个问题。
该文章地址:https://blog.csdn.net/qq_33915826/article/details/79672772
问题图片
解答
我们都知道,ParNew算法和Parallel Scavenge算法的本质是几乎一致的。只不过Parallel Scavenge算法并没有使用分代式GC框架——generational GC framework,ParNew算法使用了generational GC framework框架,所以ParNew算法可以用在CMS里,而Parallel Scavenge不可以。
那既然Parallel Scavenge算法没有使用分布式GC框架,但是Serial GC是使用了分布式GC框架的,那么为什么在使用JVM参数:-XX:+UseParallelGC -XX:-UseParallelOldGC
后(因为从Java se 7u4版本开始,应用-XX:+UseParallelGC参数后, 参数UseParallelOldGC 默认也会开启,参考的版本releaseNote https://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html),JVM仍可以使用Parallel Scavenge+Serial Old的组合呢?
其实JVM中与Parallel Scavenge搭配的Serial Old并非是Serial Old收集器,而是一个在Serial Old收集器外套了一层皮的名叫Parallel Scavenge Mark Sweep收集器(PSMarkSweep)。骨子里是一样的LISP2算法的mark-compact收集器(别被名字骗了,它并不是一个mark-sweep收集器,而是一个mark-sweep-compress算法)。