Parallel Scavenge收集器为什么可以和Serial Old收集器连用?

在学习JVM各种GC的过程中,翻看了不少文章,其中一篇文章的评论区的一个问题引起了我的注意,最终解答后准备记录一下这个问题。

该文章地址:https://blog.csdn.net/qq_33915826/article/details/79672772

问题图片

那Parallel scavenge和serial old不是一个框架,为啥可以配合使用?

解答

我们都知道,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算法)。

参考资料:

https://hllvm-group.iteye.com/group/topic/37095#post-242695

标签:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code