请说明Java中CMS与G1垃圾收集器在并发执行阶段是如何保证正确性的,包括它们各自使用的同步或记忆集机制,以及面临的主要挑战。
考察说明
考查对CMS与G1并发垃圾收集内部机制及正确性保障的理解。
回答思路
- 【回答框架 1】CMS使用增量更新方式处理并发标记期间对象引用变化,通过写屏障记录引用变更,并在重新标记阶段扫描这些记录,确保标记正确性。
- 【回答框架 2】G1采用SATB(快照标记)方式,在并发标记开始时对堆对象图做逻辑快照,通过写屏障记录并发期间的引用变更,并在标记结束后处理这些变更,避免漏标。
- 【回答框架 3】两者并行阶段都需处理并发修改,CMS的增量更新与G1的SATB各有优劣,CMS可能产生浮动垃圾,G1的SATB则需额外处理未处理完的引用变更。
- 【回答框架 4】并发收集的并发性要求GC与用户线程并行,正确性依赖写屏障、记忆集等结构,且需处理并发失败,如CMS的晋升失败和G1的并发标记失败,可能导致Full GC。
- 【回答框架 5】G1通过分区和可预测停顿模型控制延迟,而CMS主要关注低延迟但可能碎片化,选择需根据应用场景权衡。
- 【关键点 1】CMS使用增量更新和写屏障记录引用变化,G1使用SATB快照标记。
- 【关键点 2】G1的并发标记基于对象图逻辑快照,通过写屏障记录变更并后续处理。
- 【关键点 3】并发正确性依赖内存屏障与记忆集等同步结构,需处理并发失败与浮动垃圾。
- 【关键点 4】G1通过分区和RSet跟踪跨区引用,CMS使用卡表和多线程标记。
- 【关键点 5】并发阶段可能触发Full GC,G1更强调可预测停顿,CMS可能碎片化。
- 【易错点 1】误将CMS的增量更新等同于SATB,二者机制不同,CMS可能漏标新引用需重新标记。
- 【易错点 2】忽略并发失败导致Full GC,CMS晋升失败和G1标记失败均需处理。
- 【易错点 3】错误认为G1完全无停顿,实际存在并发标记后的重新标记等暂停。