JVM 垃圾收集器发展史就是一部低延迟优化史。从单线程到并发,从分代到分区,每一代 GC 都在解决什么问题?

一、垃圾回收理论基础

  • 1.1 标记阶段——可达性分析
  • 1.2 清除阶段——标记-清除、标记-整理、标记-复制
  • 1.3 分代收集理论——弱分代假说与跨代引用假说
  • 1.4 记忆集(Remembered Set)与卡表(Card Table)

二、Serial / Serial Old——最早的收集器

  • 2.1 单线程工作的原理
  • 2.2 Stop The World(STW)的全过程
  • 2.3 适用场景——桌面应用、单核服务器

三、ParNew——Serial 的多线程版本

  • 3.1 新生代并行收集
  • 3.2 与 CMS 的”黄金搭档”关系

四、Parallel Scavenge / Parallel Old——吞吐量优先

  • 4.1 关注点:CPU 利用率 vs 用户停顿时间
  • 4.2 -XX:MaxGCPauseMillis-XX:GCTimeRatio 的博弈
  • 4.3 自适应调节策略 UseAdaptiveSizePolicy

五、CMS——低延迟的先行者

  • 5.1 并发标记-清除的四个阶段
  • 5.2 初始标记 → 并发标记 → 重新标记 → 并发清除
  • 5.3 三色标记法与增量更新
  • 5.4 浮动垃圾与 Concurrent Mode Failure
  • 5.5 内存碎片问题与 Full GC 降级

六、G1——平衡吞吐量与延迟

  • 6.1 Region 分区设计——打破固定分代
  • 6.2 Humongous Object 大对象区
  • 6.3 混合回收(Mixed GC)
  • 6.4 SATB(Snapshot-At-The-Beginning)并发标记
  • 6.5 停顿预测模型——-XX:MaxGCPauseMillis 到底怎么起作用
  • 6.6 G1 调优参数实战

七、ZGC——亚毫秒级延迟

  • 7.1 染色指针(Colored Pointers)技术
  • 7.2 读屏障与并发整理
  • 7.3 动态 Region 大小
  • 7.4 NUMA 感知
  • 7.5 ZGC 在 JDK 各版本的演进(JDK11 → JDK21 分代 ZGC)

八、Shenandoah——另一个低延迟选择

  • 8.1 Brooks Pointer 转发指针
  • 8.2 与 ZGC 的核心差异

九、垃圾收集器选型指南

  • 9.1 场景匹配:批处理 / Web 服务 / 低延迟交易
  • 9.2 JDK 版本的默认 GC 变化
  • 9.3 一个选型决策树