
简单来说:
CMS 是追求极致低延迟但存在碎片化风险的“老将”
G1 是兼顾吞吐量和可控延迟、专为大堆设计、能有效管理碎片的“现代主力”

Concurrent Mode Failure (CMF) 是 CMS (Concurrent Mark-Sweep) 垃圾回收器特有的一种失败场景,指的是 在并发回收(主要是并发清除阶段)过程中,应用程序需要分配对象到老年代,但老年代空间不足以满足此次分配(或晋升)需求,迫使 CMS 中断并发回收过程,转而触发一次代价高昂的 Full GC(通常是 Serial Old GC) 来回收整个堆(包括新生代和老年代),导致应用线程长时间停顿(STW)
这是 CMF 最常见、最直接的表现形式之一。新生代进行 Minor GC 时,需要将存活对象晋升到老年代。
原因:
1、老年代剩余空间 总量不足 容纳所有要晋升的对象。
2、老年代有 总量足够的空闲空间,但因碎片化没有足够大的连续空间来晋升某个/某些较大对象。
晋升失败会立即触发 CMF,导致 Full GC (Serial Old)。
针对老年代的垃圾回收,能显著减少停顿时间,提升应用性能。
采用了并发标记清除算法,回收过程中不需要完全停止其他应用线程,提高了系统的吞吐量。
由于采用标记清除算法,容易产生内存碎片,可能导致后续对象分配时出现空间不足的问题。
对于大型堆或存在大量存活对象的场景,CMS的性能可能不佳,回收效率降低。
停顿时间短且可预测,用户可以根据实际需求指定最大停顿时间,满足应用的性能要求。
通过将堆划分为多个Region,实现了空间的整合,降低了内存碎片的产生,提高了内存的利用率。
G1的内存布局允许其从整体上基于“标记-整理”算法实现垃圾回收,但在局部上又基于“标记-复制”算法实现,这种混合算法使得G1在内存管理方面更加高效和灵活。
G1需要维护一个记忆集(具体来说是卡表)来记录新生代和老年代之间的引用关系,这种数据结构需要占用大量的内存资源,可能达到整个堆内存容量的20%甚至更多。
G1中维护记忆集的成本较高,带来了更高的执行负载,可能对系统的整体性能产生一定的影响。