JVM篇:CMS与G1区别&适用场景

        关于JMV垃圾收集器,面试常问CMS与G1的区别问题,总是记不住。为了方便记录,整理成如下表格,从不同维度对比CMS和G1两个收集器。

区别CMSG1
回收对象

回收老年代

需要配合新生代收集器一起使用

老年代和新生代
STW时间以最小停顿时间为目标可预计的垃圾回收停顿时间
回收算法标记清除标记整理
垃圾碎片产生内存碎片没有内存碎片
垃圾回收过程
  1. 初始标记(STW)
  2. 并发标记
  3. 重新标记(STW)
  4. 并发清除
  1. 初始标记(STW)
  2. 并发标记
  3. 最终标记(STW)
  4. 筛选回收(STW)
浮动垃圾

会产生浮动垃圾(第四阶段产生)

没有浮动垃圾(第四阶段,用户线程卡停)

浮动垃圾产生原因第四阶段并发清楚,GC线程和用户线程同时运行,用户线程会产生浮动垃圾
浮动垃圾导致结果浮动垃圾导致内存不足时候,出现“Concurrent Mode Failure”,出现此错误时就会切换到SerialOld收集模式
大对象处理直接进入老年代如果大于一个region的50%,会横跨多个region进行存放
优点
  1. 并发收集,低停顿
  1. 控制垃圾回收时间:选择一组合适的region最为回收目标,达到实时收集目的
  2. 空间整理:不会产生空间碎片
缺点
  1. 标记清除,产生大量内存碎片。(导致fullGc)
  2. 无法处理浮动垃圾,内存不足时出现“Concurrent Mode Failure”(并发模式故障),切换到SerialOld收集模式
  3. CPU敏感资源敏感,第二阶段并发阶段虽然不会导致用户线程停顿,但如果再CPU资源不足情况下,应用会有明显卡顿
使用场景
  1. JDK8及更高版本同等环境下只要cpu性能比较好并且内存不算大 (最少4G)可以使用CMS
  2. JDK7及更低版本同等环境下 可选择CMS (G1不完善)
  1. 实时数据占用超过一半的堆空间
  2. 对象分配或者晋升的速度变化大
  3. 希望消除长时间的GC停顿
  4. G1适合8/16G以上的内存使用

参考资料

垃圾回收器CMS和G1_Ysming88的博客-CSDN博客

CMS收集器和G1收集器的区别_cms和g1的区别_技术无产者的博客-CSDN博客