CMS和G1的区别
悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔
区别一:使用的范围不一样:
- CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。
- G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用
区别二:STW的时间:
- CMS收集器以最小的停顿时间为目标的收集器
- G1收集器可预测垃圾回收已 的停顿时间(建立可预测的停顿时间模型)
区别三: 垃圾碎片
- CMS收集器是使用“标记-清除"算法进行的垃圾回收,容易产生内存碎片
- G1收集器使用的是"标记-整理"算法,进行了空间整合,没有内存空间碎片
区别四: 垃圾回收的过程不一样

注意这两个收集器第四阶段得不同
区别五:CMS会产生浮动垃圾
- CMS产生浮动垃圾过多时会退化为serial old,效率低,因为在上图的第四阶段,CMS清除垃圾时是并发清除的,这个时候,垃圾回收线程和用户线程同时工作会产生浮动垃圾,也就意味着CMS垃圾回收器必须预留一部分内存空间用于存放浮动垃圾
- 而G1没有浮动垃圾,G1的筛选回收是多个垃圾回收线程并行gc的,没有浮动垃圾的回收,在执行'并发清理'步骤时,用户线程也会同时产生一部分可回收对象,但是这部分可回收对象只能在下次执行清理是才会被回收。如果在清理过程中预留给用户线程的内存不足就会出现"Concurrent Mode Failyre,一旦出现此错误时便会切换到SerialOld收集方式。
什么情况下使用CMS,什么情况下使用G1?
CMS适用场景:
- 低延迟需求:适用于对停顿时间要求敏感的应用程序,
老生代收集:主要针对老年代的垃圾回收。 - 碎片化管理:容易出现内存碎片,可能需要定期进行FuII GC来压缩内存空间。
G1适用场景
- 大堆内存:适用于需要管理大内存堆的场景,能够有效处理数GB以上的堆内存。
- 对内存碎片敏感:G1通过紧凑整理来减少内存碎片,降低了碎片化对性能的影响
- 比较平衡的性能:G1在提供较低停顿时间的同时,也保持了相对较高的吞吐量。
G1回收器的特色是什么
G1 的特点:
- G1最大的特点是引入分区的思路,弱化了分代的概念
- 合理利用垃圾收集各个周期的资源,解决了其他收集器、甚至 CMS 的众多缺陷
G1相比较 CMS 的改进:
- 算法: G1基于标记--整理算法,不会产生空间碎片,在分配大对象时,不会因无法得到连续的空间,而提前触发一次 FULL GC 。
- 停顿时间可控: G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象。
- 并行与并发:G1 能更充分的利用 CPU 多核环境下的硬件优势,来缩短 stop the world 的停顿时间。

浙公网安备 33010602011771号