在Java后端面试中,面试题:CMS 和 G1 垃圾收集器的区别是考察JVM高级优化、高并发场景适配能力的核心题目——它不仅能看穿你对垃圾回收底层逻辑的掌握程度,更能判断你是否具备根据业务场景选择GC器的实战能力。鳄鱼java社区的面试跟踪数据显示,能讲清内存模型差异、STW控制逻辑、场景适配依据的求职者,JVM优化岗位通过率比仅背“CMS并发,G1分区”的高92%。
一、拆解:面试题背后的3个核心考察点

很多求职者开口就罗列“G1是分区回收,CMS是老年代专属”,但这完全没触及面试官的考察点。这个面试题的本质是要你回答3个关键问题:
1. 底层设计逻辑差异:为什么CMS用标记-清除,G1用标记-整理+分区?这种设计的权衡是什么?
2. STW控制能力差异:G1的“可预测停顿”是怎么实现的?为什么CMS的STW时间不可控?
3. 业务场景适配逻辑:什么场景选CMS,什么场景选G1?依据是什么?
鳄鱼java社区的JVM专家强调:面试中第一个提到“CMS是面向低延迟的老年代GC,G1是面向全堆的可预测延迟GC”的求职者,会立刻获得面试官的好感——这证明你不是在背模板,而是理解工程实战逻辑的开发者。
二、核心区别1:内存模型与回收算法的本质差异
GC器的核心差异源于内存模型的设计,这是所有区别的根源:
1. CMS的内存模型:分代专属,堆内存整体管理 CMS(Concurrent Mark Sweep)是老年代专属垃圾收集器,必须搭配新生代的ParNew垃圾收集器使用(新生代用标记-复制,老年代用标记-清除+并发回收)。它的内存模型是传统的分代结构:新生代(Eden+2*Survivor)和老年代物理隔离,老年代内存是连续的整块空间。
算法缺陷:标记-清除算法会产生大量内存碎片,当老年代碎片率超过30%时,大对象分配失败会触发Full GC(Serial Old回收),STW时间长达数秒。鳄鱼java社区的生产环境测试显示,CMS的老年代碎片率最高可达45%,每月平均触发2-3次Full GC。
2. G1的内存模型:全堆分区,Region化管理 G1(Garbage-First)是面向全堆的垃圾收集器,打破了传统分代物理隔离的模型。它将整个堆内存划分为多个大小相等的Region(1MB-32MB,由JVM自动选择),每个Region既可以是新生代的Eden/Survivor,也可以是老年代,通过动态标记实现逻辑分代。
算法优势:G1采用标记-整理(整体)+标记-复制(局部)组合算法,回收时优先选择垃圾比例最高的Region(Garbage-First的由来),同时通过Remembered Set(记忆集)避免全堆扫描,既解决了内存碎片问题,又保证了回收效率。鳄鱼java的实战数据显示,G1的老年代碎片率稳定在5%以下,几乎不会触发Full GC。
三、核心区别2:回收流程与STW控制的能力差异
STW(Stop The World)时间是高并发场景的核心痛点,CMS和G1的回收流程直接决定了STW的可控性:
1. CMS的回收流程:4阶段,STW不可控 CMS的回收流程分为4个阶段: - 初始标记:STW,标记GC Roots直接关联的老年代对象,耗时约10-20ms; - 并发标记:与用户线程并行,遍历老年代可达对象,耗时最长(数秒)但无STW; - 重新标记:STW,修正并发标记期间用户线程修改的对象标记,耗时约50-100ms; - 并发清除:与用户线程并行,回收未标记的对象,无STW。
STW问题:重新标记阶段的STW时间随老年代内存增大而线性增长,当老年代内存达到16G时,重新标记的STW时间可达500ms以上,且并发清理时产生的浮动垃圾(占老年代的10%-20%)会导致下一次GC提前。
2. G1的回收流程:6阶段,STW可预测 G1的回收流程分为6个阶段: - 初始标记:STW,标记GC Roots直接关联的对象,耗时约5-10ms; - 并发标记:与用户线程并行,遍历全堆可达对象,同时计算每个Region的垃圾比例; - 最终标记:STW,用SATB(Snapshot At The Beginning)快照修正标记,耗时约30-80ms; - 筛选回收:STW,按用户设置的最大STW时间(如200ms),优先回收垃圾比例最高的Region,通过复制存活对象到空Region实现整理,无STW延迟。
STW优势:G1的筛选回收阶段可以通过设置-XX:MaxGCPauseMillis参数控制STW时间,JVM会自动调整每次回收的Region数量,保证实际停顿不超过设置值。鳄鱼java社区的电商项目测试显示,设置MaxGCPauseMillis=200ms时,G1的实际STW时间稳定在150-180ms,比CMS减少70%以上。
四、核心区别3:适用场景与资源消耗的差异
面试中必然会追问“什么场景用CMS,什么场景用G1”,这是考察场景适配能力的关键:
1. CMS的适用场景:中小堆内存,低延迟敏感但可接受偶尔长停顿 CMS适合堆内存≤8G的服务,比如小型后端服务、管理后台,它的并发回收阶段对CPU资源敏感(需要至少2个CPU核心),但在中小堆下STW时间可控,且内存消耗比G1低15%左右。当堆内存超过16G时,CMS的STW时间会显著增加,同时内存碎片问题会导致服务稳定性下降。
2. G1的适用场景:大堆内存,低延迟且可预测的高并发场景 G1适合堆内存≥8G的服务,比如电商订单系统、金融交易系统、实时数据平台,它的分区回收和可预测STW能力,能保证大堆下的服务稳定性。但G1的Remembered Set和SATB快照会消耗额外的内存(约占堆内存的10%-20%)和CPU资源,在中小堆下性能不如CMS。
五、面试高频追问:CMS的痛点与G1的优化
面试官在问完面试题:CMS 和 G1 垃圾收集器的区别后,通常会追问以下问题,提前准备好答案能大幅提升通过率:
1. 为什么CMS会出现Concurrent Mode Failure? 并发清理阶段,用户线程产生的浮动垃圾超过老年代预留空间(默认10%),或者老年代碎片导致大对象分配失败,会触发Concurrent Mode Failure,转而用Serial Old进行Full GC,STW时间长达数秒。
2. G1怎么避免CMS的Concurrent Mode Failure? G1通过分区回收和可预测停顿,每次只回收部分Region,不会一次性消耗老年代内存;同时G1的标记-整理算法避免了内存碎片,大对象可以分配到连续的Humongous Region(超过Region一半的大对象专属Region),不会出现分配失败。
六、面试应答技巧:满分模板
回答面试题:CMS 和 G1 垃圾收集器的区别时,要遵循“核心定位→内存模型→STW控制→场景适配”的逻辑,
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





