Java面试宝典:G1垃圾收集器上
1. JDK8为什么不使用CMS作为默认垃圾收集器
CMS(Concurrent Mark-Sweep)作为老牌并发收集器,在JDK8前被广泛应用,但其固有缺陷导致其无法成为默认选择:
1.1 低效的并发处理能力
- 初始标记(Initial Mark)和重新标记(Remark)阶段需STW(Stop-The-World)
- 单线程/双线程模式下效率极低(尤其在大型堆场景)
- 并发标记阶段吞吐量显著下降(CPU资源争夺)
1.2 并发失败(Concurrent Mode Failure)风险
- 当老年代空间不足以分配新晋升对象时触发
- 触发后降级为Serial Old收集器(单线程Full GC)
- 极端场景下停顿可达5秒以上(违背低延迟目标)
1.3 内存碎片化顽疾
- 标记-清除算法不整理内存空间
- 长期运行后碎片化导致Full GC概率激增
- 大对象分配失败率随运行时间线性上升
1.4 吞吐量设计缺陷
- 并发阶段占用应用线程资源(最高30%