常见收集器:Serial 是单线程收集器,适合客户端小应用;Parallel Scavenge/Parallel Old 以吞吐量为目标,多线程并行回收,适合后台计算型任务;CMS 以低停顿为目标,老年代收集器,采用并发标记-清除,大部分工作与用户线程并发;G1 面向大堆,可预测停顿,JDK 9 起为默认收集器;此外还有追求超低延迟的 ZGC、Shenandoah。

G1 与 CMS 的核心区别:内存布局上,CMS 沿用连续分代(新生代+老年代),G1 把堆划分为多个等大的 Region,每个 Region 动态扮演 Eden/Survivor/Old 角色,还有专门存大对象的 Humongous 区。算法上,CMS 用标记-清除,会产生碎片,碎片过多时退化为 Serial Old 做 Full GC 整理;G1 整体上基于标记-整理、Region 间用复制,基本不产生碎片。停顿控制上,G1 通过可预测的停顿模型(-XX:MaxGCPauseMillis)优先回收垃圾最多的 Region(Garbage First 名称来源),CMS 无此能力。另外 CMS 在 JDK 14 已被移除。

追问方向:G1 的 Mixed GC 是什么?CMS 的并发模式失败(concurrent mode failure)?

(约 360 字)