CMS前世此生

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


垃圾回收器为何要分区分代?


image.png

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


image.png


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


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

image.png

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


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

image.png

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

image.png


为啥蹦出来个CMS+ParNew


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


介绍CMS阶段


CMS,全名称Concurrent Mark Sweep,中文释义并发标记清除,从名字上能够看出算法思想使用标记清除算法,下面咱们看看CMS简化处理流程。ide

image.png

  • 初始标记。只标记GC root可达的第一个节点。会短暂的STW。
  • 并发标记。用户线程和垃圾线程同时进行。垃圾线程会继续向下寻找GCroot,不会有STW。但也会有两个问题。
    • 多标:以前不是垃圾,如今线程出栈引用断开了变成了垃圾。也称为浮动垃圾。
    • 错标:以前已经被标注是垃圾,但如今从新引用。
  • 从新标记。STW时间通常低于200毫秒。
  • 并发清除。并发清除时,由于用户线程和垃圾线程一块儿工做,若是CMS线程异常,可能会触发SO单线程执行。程序可能会特别缓慢。

劣势:碎片严重。spa


总结


主要简单介绍了分代垃圾回收器,特别介绍了cms执行过程,G1留下次再说吧。好了,文章有地方还写的不清晰但愿亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是叫练,边叫边练,公众号叫练,微信号【jiaolian123abc】。祝你们生活愉快。线程