CMS前世今生

Java141

CMS一直是面试中的常考点,今天我们用通俗易懂的语言简单介绍下。

垃圾回收器为什么要分区分代?

如上图:JVM虚拟机将堆内存区域分代了,先生代是朝生夕死的区域,老年代是老不死的区域,不同的年代对象有不同特性,因此需要不同的垃圾收集器去处理。如下图, 黑竖线左边的区域都是分代垃圾收集器,G1之后内存就不分代了。

单线程垃圾收集器:Serial + Serial Old

Serial(SY),Serial Old(SO)是单线程垃圾收集器组合,垃圾收集线程是单线程的,随着现代内存区域越来越大,SY+SO组合已经越来越少了。垃圾收集的单线程需要STW时间无疑越长。这种组合比较合适较早JDK版本。如下图,用户线程表示应用程序处理过程,垃圾收集线程表示垃圾线程清理垃圾过程,此阶段应用程序是需要等待垃圾线程STW的。

多线程垃圾收集器:PS+PO

前面我们说了,单线程垃圾收集器缺点就是当内存区域变大,收集效率会很低,那OK,摇身一变,如下图,多线程垃圾处理器。

值得注意的是:PS+PO组合是JDK1.7,JDK1.8默认垃圾收集器。通过 java -XX:+PrintCommandLineFlags命令可以在Dos界面查看。如下图,该命令可以查看JVM初始化的默认参数。比如: -XX:InitialHeapSize表示初始化堆大小。

为啥蹦出来个CMS+ParNew

并行处理有了,CMS+ParNew又是干嘛的?其实PO关注是吞吐量,而CMS关注是缩短STW时间。而CMS处理流程更复杂,至于ParNew,其实约等于PS,如果你注意最上面一个图,你会发现PS年轻代无法和CMS组合。所以就多出来了一个ParNew。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长