2022年4月24日 作者 zeroheart

cms和g1的区别

CMS 和G1 的区别 – 简书 (jianshu.com)

区别一: 使用范围不一样

CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用

区别二: STW的时间

CMS收集器以最小的停顿时间为目标的收集器。

G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)

区别三: 垃圾碎片

CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片

G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。

CMS的总结和优缺点

CMS采用 标记-清理 的算法,标记出垃圾对象,清除垃圾对象。算法是基于老年代执行的,因为新生代产生无法接受该算法产生的碎片垃圾。

优点:并发收集,低停顿

不足

  • 无法处理浮动垃圾,并发收集会造成内存碎片过多
  • 由于并发标记和并发清理阶段都是并发执行,所以会额外消耗CPU资源

G1回收器的特点

G1的出现就是为了替换jdk1.5种出现的CMS,这一点已经在jdk9的时候实现了,jdk9默认使用了G1回收器,移除了所有CMS相关的内容。G1和CMS相比,有几个特点:

  1. 控制回收垃圾的时间:这个是G1的优势,可以控制回收垃圾的时间,还可以建立停顿的时间模型,选择一组合适的Regions作为回收目标,达到实时收集的目的
  2. 空间整理:和CMS一样采用标记-清理的算法,但是G1不会产生空间碎片,这样就有效的使用了连续空间,不会导致连续空间不足提前造成GC的触发

G1把Java内存拆分成多等份,多个域(Region),逻辑上存在新生代和老年代的概念,但是没有严格区分

依旧存在新生代老年代的概念,但是没有严格区分。Region最多分为2048个

大对象的处理

除了上面优点之外,还有一个优点,那就是对大对象的处理。在CMS内存中,如果一个对象过大,进入S1、S2区域的时候大于改分配的区域,对象会直接进入老年代。G1处理大对象时会判断对象是否大于一个Region大小的50%,如果大于50%就会横跨多个Region进行存放。

JVM 垃圾回收机制 – 09itblog

cms标记清除阶段

  1. 初始标记(CMS initial mark,需要 STW,耗时短),只扫描直接和 GC Roots 关联的对象
  2. 并发标记(CMS concurrent mark,耗时长,不需要 STW),基于(1)的结果进行 GC Roots Tracing,所有可到达的对象都在本阶段中标记。
  3. 并发预处理(CMS concurrent preclean,耗时长),为了减少(3)的处理时间,标记从新生代晋升的对象、新分配到老年代的对象以及在并发阶段被修改了的对象。
  4. 重新标记(CMS remark,需要 STW,耗时一般大于(1),远远小于(2)),重新扫描堆中的对象,进行可达性分析,标记活着的对象,处理可能新产生的垃圾。
  5. 并发清除(CMS concurrent sweep,耗时长,不需要 STW),激活用户线程,同时清理那些无效的对象。
  6. 并发重置(CMS concurrent reset),重置 CMS 收集器的数据结构,等待下一次垃圾回收。

初始标记、重新标记阶段需要stw,并发标记不需要。

JVM 垃圾回收器 — G1 – 09itblog