一、GC 收集器分类总览按回收区域分类年轻代收集器Serial、ParNew、Parallel Scavenge老年代收集器Serial Old、Parallel Old、CMS整堆收集器G1、ZGC、Shenandoah按工作模式分类模式特点代表串行Serial单线程全程 STWSerial并行Parallel多线程全程 STW吞吐量优先Parallel Scavenge并发Concurrent部分阶段与应用线程并发低停顿CMS、G1并发整理Concurrent Compacting全阶段并发几乎零停顿ZGC、Shenandoah2026 年 JDK 25 最新状态G1JEP 523 成为所有环境默认包括受限环境Remembered Set 内存降低 62%ZGC非分代模式已在 JDK 24 移除仅保留分代 ZGC-XX:ZGenerational 不再需要Shenandoah分代模式在 JDK 25正式化不再需要实验性标志二、Serial / Serial Old串行收集器适用场景单核 CPU、客户端模式Client VM、内存较小 100MB参数-XX:UseSerialGC年轻代 Serial 回收流程标记-复制算法STW 开始├─ 单线程标记 Eden From Survivor 中的存活对象├─ 单线程复制存活对象到 To Survivor├─ 清空 Eden From Survivor├─ From/To 交换角色└─ 年龄达标默认15→ 晋升老年代STW 结束老年代 Serial Old 回收流程标记-整理算法STW 开始├─ 单线程标记所有存活对象├─ 单线程整理将存活对象向一端移动└─ 清理边界外的内存STW 结束特点单线程回收实现简单无线程切换开销STW 时间长秒级不适合服务端无内存碎片Serial Old 使用标记-整理JDK 8 之前 Client 模式默认现已被淘汰三、Parallel / Parallel Old并行收集器 / 吞吐量优先适用场景后台计算、批处理、科学计算追求最大吞吐量参数-XX:UseParallelGC 或 -XX:UseParallelOldGC年轻代 Parallel Scavenge 回收流程标记-复制算法STW 开始├─ 多线程并行标记存活对象线程数 CPU 核心数├─ 多线程并行复制到 To Survivor├─ 清空 Eden From Survivor└─ From/To 交换STW 结束老年代 Parallel Old 回收流程标记-整理算法STW 开始├─ 多线程并行标记存活对象├─ 多线程并行整理移动存活对象└─ 清理边界外内存STW 结束核心指标吞吐量 用户代码运行时间 / (用户代码 GC 时间)特点多线程并行充分利用多核 CPU吞吐量最高适合 CPU 密集型任务可自适应调节-XX:UseAdaptiveSizePolicySTW 时间比 Serial 短但仍需停顿JDK 8 Server 模式默认Parallel Scavenge Parallel Old关键参数参数说明-XX:MaxGCPauseMillisn目标最大停顿时间JVM 会调整堆大小-XX:GCTimeRationGC 时间占比目标默认 99即 1%四、CMSConcurrent Mark Sweep并发标记清除适用场景互联网应用、Web 服务追求低停顿 1秒参数-XX:UseConcMarkSweepGC搭配年轻代ParNew-XX:UseParNewGCCMS 回收流程老年代标记-清除算法阶段 1初始标记Initial Mark—— STW极短标记 GC Roots 直接关联的对象时间 10ms与 Minor GC 的 STW 复用阶段 2并发标记Concurrent Mark—— 与应用线程并发从 GC Roots 出发遍历整个对象图不 STW用户线程继续运行耗时较长取决于堆大小和对象数量使用增量更新Incremental Update记录新增引用阶段 3重新标记Remark—— STW较短修正并发标记期间变动的标记处理增量更新队列中的引用变化时间比初始标记长但远小于并发标记阶段 4并发清除Concurrent Sweep—— 与应用线程并发清理已标记为垃圾的对象不 STW用户线程继续运行耗时较长但不停顿时间线示意CMS 的致命缺陷1. 内存碎片标记-清除算法产生大量碎片大对象分配失败触发 Full GC缓解-XX:UseCMSCompactAtFullCollectionFull GC 时整理2. 浮动垃圾Floating Garbage并发清理期间产生的新垃圾本轮无法回收需预留空间-XX:CMSInitiatingOccupancyFraction默认 68%预留不足 → Concurrent Mode Failure3. Concurrent Mode Failure并发模式失败—— 最严重并发标记期间老年代空间被耗尽CMS 无法继续退化为 Serial Old 单线程 Full GC停顿时间剧增秒级用户体验极差4. 对 CPU 敏感并发阶段占用 CPU 资源降低吞吐量CMS 参数参数说明-XX:CMSInitiatingOccupancyFractionn老年代占用达 n% 时触发 CMS默认 68-XX:UseCMSInitiatingOccupancyOnly只用设定阈值不自动调整-XX:CMSParallelRemarkEnabled并行重新标记-XX:CMSScavengeBeforeRemark重新标记前触发 Minor GC五、G1Garbage First区域化分代收集器适用场景大堆内存 4GB、可预测停顿时间、平衡吞吐量和延迟参数-XX:UseG1GCJDK 9 默认JDK 25 JEP 523 成为所有环境默认G1 核心设计1. Region 化内存布局将堆划分为多个 Region1~32MB默认 2048 个每个 Region 动态扮演不同角色Eden Region年轻代 Eden 区Survivor Region年轻代 Survivor 区Old Region老年代Humongous Region大对象 Region 的 50%连续多个 Region 组成直接分配在老年代区域Free Region空闲区域Region 角色可在不同回收周期之间改变2. Garbage First 策略维护优先列表按回收价值排序回收价值 垃圾占比 / 回收耗时每次选择回收价值最高的 Region在有限时间内最大化回收量3. 可预测停顿时间模型-XX:MaxGCPauseMillis默认 200msG1 根据历史数据预测每个 Region 的回收耗时选择 Region 组合确保总停顿时间 目标值G1 回收流程 —— Mixed GC阶段 1初始标记Initial Marking—— STW很短标记 GC Roots 直接关联的对象修改 TAMS 指针Top at Mark Start复用 Young GC 的 STWpiggyback不额外停顿阶段 2根区域扫描Root Region Scanning—— 并发扫描 Survivor Region 中引用老年代的对象必须在下一次 Young GC 之前完成原因Young GC 会移动 Survivor 对象引用关系变化阶段 3并发标记Concurrent Marking—— 并发遍历整个堆标记所有存活对象使用 SATBSnapshot-At-The-Beginning 算法标记开始时创建存活对象快照写屏障记录引用变更旧值存入 SATB 队列保守但正确可能多标记一些垃圾但不会漏标存活对象可被打断Young GC 优先TAMS 指针Region 内 TAMS 之上对象默认存活不标记阶段 4重新标记Remark—— STW处理 SATB 队列中的引用变化计算各 Region 的存活对象比例时间较短阶段 5清理Cleanup—— 部分 STW统计各 Region 垃圾占比按回收价值排序选择回收价值最高的 Region 组成回收集Collection Set清空完全为空的 Region非 STW重置已清理 Region阶段 6混合回收Mixed GC—— STW复制 Eden Survivor 部分 Old Region 到新的 Region标记-整理 复制混合可多次执行-XX:G1MixedGCCountTarget默认 8每次回收部分老年代控制单次停顿时间清空旧 RegionG1 的 Remembered SetRSet每个 Region 维护一个 RSet记录哪些 Region 引用了本 Region 的对象作用避免全堆扫描快速定位跨 Region 引用更新通过写屏障 Dirty Card Queue 异步更新应用线程将引用变更写入线程私有的 Dirty Card QueueRefinement 线程异步消费队列更新 RSet队列满时应用线程参与排空拖慢分配自我保护JDK 25 优化RSet 内存降低 62%64GB 堆从 2GB 降至 0.75GBG1 的 Full GC触发条件并发标记失败、Mixed GC 后空间仍不足使用单线程 Serial Old 算法标记-整理停顿时间长应尽量避免G1 参数参数说明-XX:MaxGCPauseMillisn目标最大停顿时间默认 200ms-XX:G1HeapRegionSizenRegion 大小默认自动计算-XX:G1NewSizePercentn年轻代最小占比默认 5%-XX:G1MaxNewSizePercentn年轻代最大占比默认 60%-XX:InitiatingHeapOccupancyPercentn触发并发标记的堆占用率默认 45%-XX:G1MixedGCCountTargetnMixed GC 目标次数默认 8-XX:G1ReservePercentn预留内存比例默认 10%六、ZGCThe Z Garbage Collector低延迟收集器适用场景超大堆内存TB 级、极低延迟要求 1ms、金融交易系统参数-XX:UseZGCJDK 11 实验性JDK 15 正式JDK 24 仅分代模式ZGC 核心设计 —— 三大黑科技1. 染色指针Colored Pointers利用 64 位指针的高 4 位存储元数据第 42-45 位4 个标记位Marked0M0第 42 位标记阶段 0 的存活对象Marked1M1第 43 位标记阶段 1 的存活对象RemappedR第 44 位对象已转移到新地址FinalizableF第 45 位对象有 finalize 方法优势无需在对象头中存储标记位节省内存标记和转移可完全并发进行转移完成后无需立即更新所有引用限制不支持压缩指针Compressed Oops内存开销 15~30%2. 读屏障Load Barrier在读取对象引用时自动插入的代码伪代码Objectload(Object*ref){if(ref has Remapped bit)returnref;Object*new_refget_forwarded_address(ref);if(CAS(ref,new_ref))returnnew_ref;returnload(ref);// 其他线程已更新重读}关键特性仅在读操作时触发写操作无需屏障开销极低现代 CPU 可预测分支优化实现无停顿并发转移对象转移中仍可访问与 Shenandoah 的 Brooks Pointer 对比ZGC读屏障 染色指针无需对象头修改ShenandoahBrooks Pointer 在对象头中需要额外空间3. 多重映射Multi-Mapping将同一块物理内存映射到多个虚拟地址空间支持染色指针的不同视图M0/M1/R 视图对象转移时只需更新映射无需复制数据短期ZGC 回收流程阶段 1初始标记Concurrent Mark 开始—— STW 1ms标记 GC Roots 直接引用的对象阶段 2并发标记Concurrent Mark—— 并发遍历对象图标记所有存活对象使用染色指针的 Marked0/Marked1 位交替标记读屏障处理并发引用变化阶段 3并发预备重定位Concurrent Prepare for Relocate—— 并发选择需要整理的 Region构建转发表Forwarding Table记录旧地址 → 新地址的映射阶段 4并发重定位Concurrent Relocate—— 并发将存活对象复制到新的 Region更新转发表旧地址 → 新地址读屏障自动转发访问对象转移中仍可正常访问这是 ZGC 的核心并发转移无停顿阶段 5并发重映射Concurrent Remap—— 并发更新所有指向旧地址的引用与下一次标记阶段合并优化避免重复扫描读屏障逐步修正未更新的引用时间线分代 ZGCGenerational ZGCJDK 21背景非分代 ZGC 每次回收扫描整个堆大堆 CPU 开销高无法利用弱分代假说大部分对象朝生夕死内存碎片问题仍存在分代设计新生代Eden Survivor复制算法回收频率高老年代标记-整理算法回收频率低双标记位循环新生代和老年代使用不同的 M0/M1 位跨代引用卡表Card Table记录老年代对新生代的引用新生代回收时只需扫描脏卡无需扫描整个老年代JDK 24 移除非分代模式分代 ZGC 成为唯一模式性能提升吞吐量提升 20~50%核心提升CPU 使用率降低 30%内存碎片显著减少最大停顿时间 5ms亚毫秒级大堆场景 Full GC 概率大幅降低ZGC 参数参数说明-XX:UseZGC开启 ZGC-XX:ZCollectionIntervaln强制 GC 间隔秒-XX:ZAllocationSpikeTolerancen分配速率容忍度默认 2-XX:UseLargePages启用大页支持强烈推荐七、Shenandoah低延迟收集器OpenJDK 特性适用场景低延迟要求、Red Hat / OpenJDK 环境、内存受限容器参数-XX:UseShenandoahGCOpenJDK 12JDK 25 分代模式正式化Shenandoah 核心设计1. Brooks Pointer转发指针每个对象头额外存储一个转发指针初始指向自身对象转移时将原对象的 Brooks 指针指向新对象所有对原对象的访问通过 Brooks 指针自动重定向读屏障检查 Brooks 指针若已转移则转发转移完成后后台线程逐步更新所有引用对象头结构┌────────────────────────────────────────┐│ mark_word │ 标记字 ││ klass_ptr │ 类指针 ││ brooks_ptr │ 转发指针Shenandoah特有│└────────────────────────────────────────┘2. 连接矩阵Connection Matrix记录 Region 之间的引用关系优化跨代引用处理减少全堆扫描3. 读写屏障读屏障读取对象引用时检查 Brooks 指针写屏障记录引用变化更新卡表与 ZGC 对比ZGC 只有读屏障Shenandoah 有读写屏障Shenandoah 回收流程阶段 1初始标记Init Mark—— STW 1ms标记 GC Roots 直接引用阶段 2并发标记Concurrent Marking—— 并发遍历对象图标记存活对象阶段 3最终标记Final Mark—— STW 1ms处理并发标记期间的引用变化阶段 4并发清理Concurrent Cleanup—— 并发清理垃圾 Region阶段 5并发转移Concurrent Evacuation—— 并发复制存活对象到新的 Region更新 Brooks 指针旧对象 → 新对象读屏障自动转发访问阶段 6并发更新引用Concurrent Update References—— 并发更新所有指向旧地址的引用分代 ShenandoahJDK 24 实验性JDK 25 正式分代模式吞吐量提升 ~30%相比单代停顿时间 1~5ms典型偶尔 ~10ms支持压缩指针Compressed Oops内存开销比 ZGC 低JDK 25 不再需要 -XX:UnlockExperimentalVMOptionsShenandoah 参数参数说明-XX:UseShenandoahGC开启 Shenandoah-XX:ShenandoahGCModegenerational分代模式JDK 25 默认-XX:ShenandoahGCHeuristicsmode启发式模式adaptive/static/compact-XX:ShenandoahPacingpacing 控制分配速率八、GC 收集器全维度对比表2026 JDK 25维度SerialParallelCMSG1ZGC(分代)Shenandoah(分代)JDK 支持所有所有所有71112默认状态淘汰JDK8默认已废弃JDK9默认可选可选(OpenJDK)回收区域年轻/老年轻/老老年代整堆整堆整堆核心算法复制/整理复制/整理标记-清除Region混合染色指针读屏障Brooks指针工作模式串行STW并行STW并发并发STW全并发全并发典型停顿100ms100ms1s20-200ms0.1-0.5ms1-5ms最坏停顿秒级秒级秒级500ms1ms~10ms吞吐量(vs G1)低最高中基准-5~15%-5~10%内存开销(vs G1)低低中基准15~30%10~20%CPU开销(vs G1)低低中基准5~10%5~15%压缩指针支持支持支持支持不支持支持最佳堆范围2GB任意4-16GB4-32GB32GB-多TB8-64GB内存碎片无无严重无无无适用场景客户端批处理低停顿(JDK8)通用超低延迟低延迟容器2026 推荐❌❌❌✅ 默认✅ 延迟敏感✅ OpenJDK九、GC 收集器选择决策树2026JDK 版本建议JDK 版本推荐收集器JDK 8G1-XX:UseG1GC或 CMS遗留系统JDK 11~16G1默认可选 ZGC实验性JDK 17~21G1默认ZGC正式Shenandoah实验性JDK 22G1默认分代 ZGC唯一模式分代 Shenandoah正式关键原则先测后选用实际负载测试不同收集器监控指标GC 停顿时间、吞吐量、内存碎片、CPU 使用率渐进升级JDK 8 → JDK 17/21 LTS逐步验证避免过度优化G1 已满足大多数场景十、关键概念深度解析1. STWStop The WorldGC 期间暂停所有应用线程所有收集器都有 STW 阶段只是长短不同Serial/Parallel全程 STWCMS初始标记 重新标记 STWG1初始标记 重新标记 混合回收 STWZGC/Shenandoah仅初始标记 STW 1ms2. 吞吐量 vs 低延迟指标定义追求代表吞吐量用户代码运行时间 / 总时间单位时间内完成更多工作Parallel Scavenge低延迟单次 GC 停顿时间响应速度用户体验ZGC、Shenandoah3. 内存碎片算法碎片情况代表标记-清除产生碎片CMS标记-整理无碎片Serial Old、Parallel Old、G1复制无碎片Serial、ParNew、Parallel Scavenge碎片导致大对象分配失败触发 Full GC。4. 写屏障Write Barriervs 读屏障Load Barrier屏障类型触发时机作用代表写屏障对象引用写入时记录引用变化CMS增量更新、G1SATB、Shenandoah读屏障读取对象引用时检查/转发对象状态ZGC染色指针、ShenandoahBrooks Pointer屏障有性能开销但实现并发 GC 的关键。5. 三色标记算法颜色含义状态白色未访问垃圾对象灰色已访问引用未完全扫描待处理黑色已访问引用完全扫描存活对象并发标记问题黑→白引用被切断白对象被误回收CMS 解决增量更新关注新增引用G1/ZGC 解决SATB关注旧值保守但安全6. 弱分代假说Weak Generational Hypothesis大部分对象朝生夕死在年轻代被回收熬过多次 GC 的对象很难死亡进入老年代分代设计的理论基础年轻代频繁回收老年代低频回收
Java随笔-GC收集器工作机制
发布时间:2026/7/8 1:51:17
一、GC 收集器分类总览按回收区域分类年轻代收集器Serial、ParNew、Parallel Scavenge老年代收集器Serial Old、Parallel Old、CMS整堆收集器G1、ZGC、Shenandoah按工作模式分类模式特点代表串行Serial单线程全程 STWSerial并行Parallel多线程全程 STW吞吐量优先Parallel Scavenge并发Concurrent部分阶段与应用线程并发低停顿CMS、G1并发整理Concurrent Compacting全阶段并发几乎零停顿ZGC、Shenandoah2026 年 JDK 25 最新状态G1JEP 523 成为所有环境默认包括受限环境Remembered Set 内存降低 62%ZGC非分代模式已在 JDK 24 移除仅保留分代 ZGC-XX:ZGenerational 不再需要Shenandoah分代模式在 JDK 25正式化不再需要实验性标志二、Serial / Serial Old串行收集器适用场景单核 CPU、客户端模式Client VM、内存较小 100MB参数-XX:UseSerialGC年轻代 Serial 回收流程标记-复制算法STW 开始├─ 单线程标记 Eden From Survivor 中的存活对象├─ 单线程复制存活对象到 To Survivor├─ 清空 Eden From Survivor├─ From/To 交换角色└─ 年龄达标默认15→ 晋升老年代STW 结束老年代 Serial Old 回收流程标记-整理算法STW 开始├─ 单线程标记所有存活对象├─ 单线程整理将存活对象向一端移动└─ 清理边界外的内存STW 结束特点单线程回收实现简单无线程切换开销STW 时间长秒级不适合服务端无内存碎片Serial Old 使用标记-整理JDK 8 之前 Client 模式默认现已被淘汰三、Parallel / Parallel Old并行收集器 / 吞吐量优先适用场景后台计算、批处理、科学计算追求最大吞吐量参数-XX:UseParallelGC 或 -XX:UseParallelOldGC年轻代 Parallel Scavenge 回收流程标记-复制算法STW 开始├─ 多线程并行标记存活对象线程数 CPU 核心数├─ 多线程并行复制到 To Survivor├─ 清空 Eden From Survivor└─ From/To 交换STW 结束老年代 Parallel Old 回收流程标记-整理算法STW 开始├─ 多线程并行标记存活对象├─ 多线程并行整理移动存活对象└─ 清理边界外内存STW 结束核心指标吞吐量 用户代码运行时间 / (用户代码 GC 时间)特点多线程并行充分利用多核 CPU吞吐量最高适合 CPU 密集型任务可自适应调节-XX:UseAdaptiveSizePolicySTW 时间比 Serial 短但仍需停顿JDK 8 Server 模式默认Parallel Scavenge Parallel Old关键参数参数说明-XX:MaxGCPauseMillisn目标最大停顿时间JVM 会调整堆大小-XX:GCTimeRationGC 时间占比目标默认 99即 1%四、CMSConcurrent Mark Sweep并发标记清除适用场景互联网应用、Web 服务追求低停顿 1秒参数-XX:UseConcMarkSweepGC搭配年轻代ParNew-XX:UseParNewGCCMS 回收流程老年代标记-清除算法阶段 1初始标记Initial Mark—— STW极短标记 GC Roots 直接关联的对象时间 10ms与 Minor GC 的 STW 复用阶段 2并发标记Concurrent Mark—— 与应用线程并发从 GC Roots 出发遍历整个对象图不 STW用户线程继续运行耗时较长取决于堆大小和对象数量使用增量更新Incremental Update记录新增引用阶段 3重新标记Remark—— STW较短修正并发标记期间变动的标记处理增量更新队列中的引用变化时间比初始标记长但远小于并发标记阶段 4并发清除Concurrent Sweep—— 与应用线程并发清理已标记为垃圾的对象不 STW用户线程继续运行耗时较长但不停顿时间线示意CMS 的致命缺陷1. 内存碎片标记-清除算法产生大量碎片大对象分配失败触发 Full GC缓解-XX:UseCMSCompactAtFullCollectionFull GC 时整理2. 浮动垃圾Floating Garbage并发清理期间产生的新垃圾本轮无法回收需预留空间-XX:CMSInitiatingOccupancyFraction默认 68%预留不足 → Concurrent Mode Failure3. Concurrent Mode Failure并发模式失败—— 最严重并发标记期间老年代空间被耗尽CMS 无法继续退化为 Serial Old 单线程 Full GC停顿时间剧增秒级用户体验极差4. 对 CPU 敏感并发阶段占用 CPU 资源降低吞吐量CMS 参数参数说明-XX:CMSInitiatingOccupancyFractionn老年代占用达 n% 时触发 CMS默认 68-XX:UseCMSInitiatingOccupancyOnly只用设定阈值不自动调整-XX:CMSParallelRemarkEnabled并行重新标记-XX:CMSScavengeBeforeRemark重新标记前触发 Minor GC五、G1Garbage First区域化分代收集器适用场景大堆内存 4GB、可预测停顿时间、平衡吞吐量和延迟参数-XX:UseG1GCJDK 9 默认JDK 25 JEP 523 成为所有环境默认G1 核心设计1. Region 化内存布局将堆划分为多个 Region1~32MB默认 2048 个每个 Region 动态扮演不同角色Eden Region年轻代 Eden 区Survivor Region年轻代 Survivor 区Old Region老年代Humongous Region大对象 Region 的 50%连续多个 Region 组成直接分配在老年代区域Free Region空闲区域Region 角色可在不同回收周期之间改变2. Garbage First 策略维护优先列表按回收价值排序回收价值 垃圾占比 / 回收耗时每次选择回收价值最高的 Region在有限时间内最大化回收量3. 可预测停顿时间模型-XX:MaxGCPauseMillis默认 200msG1 根据历史数据预测每个 Region 的回收耗时选择 Region 组合确保总停顿时间 目标值G1 回收流程 —— Mixed GC阶段 1初始标记Initial Marking—— STW很短标记 GC Roots 直接关联的对象修改 TAMS 指针Top at Mark Start复用 Young GC 的 STWpiggyback不额外停顿阶段 2根区域扫描Root Region Scanning—— 并发扫描 Survivor Region 中引用老年代的对象必须在下一次 Young GC 之前完成原因Young GC 会移动 Survivor 对象引用关系变化阶段 3并发标记Concurrent Marking—— 并发遍历整个堆标记所有存活对象使用 SATBSnapshot-At-The-Beginning 算法标记开始时创建存活对象快照写屏障记录引用变更旧值存入 SATB 队列保守但正确可能多标记一些垃圾但不会漏标存活对象可被打断Young GC 优先TAMS 指针Region 内 TAMS 之上对象默认存活不标记阶段 4重新标记Remark—— STW处理 SATB 队列中的引用变化计算各 Region 的存活对象比例时间较短阶段 5清理Cleanup—— 部分 STW统计各 Region 垃圾占比按回收价值排序选择回收价值最高的 Region 组成回收集Collection Set清空完全为空的 Region非 STW重置已清理 Region阶段 6混合回收Mixed GC—— STW复制 Eden Survivor 部分 Old Region 到新的 Region标记-整理 复制混合可多次执行-XX:G1MixedGCCountTarget默认 8每次回收部分老年代控制单次停顿时间清空旧 RegionG1 的 Remembered SetRSet每个 Region 维护一个 RSet记录哪些 Region 引用了本 Region 的对象作用避免全堆扫描快速定位跨 Region 引用更新通过写屏障 Dirty Card Queue 异步更新应用线程将引用变更写入线程私有的 Dirty Card QueueRefinement 线程异步消费队列更新 RSet队列满时应用线程参与排空拖慢分配自我保护JDK 25 优化RSet 内存降低 62%64GB 堆从 2GB 降至 0.75GBG1 的 Full GC触发条件并发标记失败、Mixed GC 后空间仍不足使用单线程 Serial Old 算法标记-整理停顿时间长应尽量避免G1 参数参数说明-XX:MaxGCPauseMillisn目标最大停顿时间默认 200ms-XX:G1HeapRegionSizenRegion 大小默认自动计算-XX:G1NewSizePercentn年轻代最小占比默认 5%-XX:G1MaxNewSizePercentn年轻代最大占比默认 60%-XX:InitiatingHeapOccupancyPercentn触发并发标记的堆占用率默认 45%-XX:G1MixedGCCountTargetnMixed GC 目标次数默认 8-XX:G1ReservePercentn预留内存比例默认 10%六、ZGCThe Z Garbage Collector低延迟收集器适用场景超大堆内存TB 级、极低延迟要求 1ms、金融交易系统参数-XX:UseZGCJDK 11 实验性JDK 15 正式JDK 24 仅分代模式ZGC 核心设计 —— 三大黑科技1. 染色指针Colored Pointers利用 64 位指针的高 4 位存储元数据第 42-45 位4 个标记位Marked0M0第 42 位标记阶段 0 的存活对象Marked1M1第 43 位标记阶段 1 的存活对象RemappedR第 44 位对象已转移到新地址FinalizableF第 45 位对象有 finalize 方法优势无需在对象头中存储标记位节省内存标记和转移可完全并发进行转移完成后无需立即更新所有引用限制不支持压缩指针Compressed Oops内存开销 15~30%2. 读屏障Load Barrier在读取对象引用时自动插入的代码伪代码Objectload(Object*ref){if(ref has Remapped bit)returnref;Object*new_refget_forwarded_address(ref);if(CAS(ref,new_ref))returnnew_ref;returnload(ref);// 其他线程已更新重读}关键特性仅在读操作时触发写操作无需屏障开销极低现代 CPU 可预测分支优化实现无停顿并发转移对象转移中仍可访问与 Shenandoah 的 Brooks Pointer 对比ZGC读屏障 染色指针无需对象头修改ShenandoahBrooks Pointer 在对象头中需要额外空间3. 多重映射Multi-Mapping将同一块物理内存映射到多个虚拟地址空间支持染色指针的不同视图M0/M1/R 视图对象转移时只需更新映射无需复制数据短期ZGC 回收流程阶段 1初始标记Concurrent Mark 开始—— STW 1ms标记 GC Roots 直接引用的对象阶段 2并发标记Concurrent Mark—— 并发遍历对象图标记所有存活对象使用染色指针的 Marked0/Marked1 位交替标记读屏障处理并发引用变化阶段 3并发预备重定位Concurrent Prepare for Relocate—— 并发选择需要整理的 Region构建转发表Forwarding Table记录旧地址 → 新地址的映射阶段 4并发重定位Concurrent Relocate—— 并发将存活对象复制到新的 Region更新转发表旧地址 → 新地址读屏障自动转发访问对象转移中仍可正常访问这是 ZGC 的核心并发转移无停顿阶段 5并发重映射Concurrent Remap—— 并发更新所有指向旧地址的引用与下一次标记阶段合并优化避免重复扫描读屏障逐步修正未更新的引用时间线分代 ZGCGenerational ZGCJDK 21背景非分代 ZGC 每次回收扫描整个堆大堆 CPU 开销高无法利用弱分代假说大部分对象朝生夕死内存碎片问题仍存在分代设计新生代Eden Survivor复制算法回收频率高老年代标记-整理算法回收频率低双标记位循环新生代和老年代使用不同的 M0/M1 位跨代引用卡表Card Table记录老年代对新生代的引用新生代回收时只需扫描脏卡无需扫描整个老年代JDK 24 移除非分代模式分代 ZGC 成为唯一模式性能提升吞吐量提升 20~50%核心提升CPU 使用率降低 30%内存碎片显著减少最大停顿时间 5ms亚毫秒级大堆场景 Full GC 概率大幅降低ZGC 参数参数说明-XX:UseZGC开启 ZGC-XX:ZCollectionIntervaln强制 GC 间隔秒-XX:ZAllocationSpikeTolerancen分配速率容忍度默认 2-XX:UseLargePages启用大页支持强烈推荐七、Shenandoah低延迟收集器OpenJDK 特性适用场景低延迟要求、Red Hat / OpenJDK 环境、内存受限容器参数-XX:UseShenandoahGCOpenJDK 12JDK 25 分代模式正式化Shenandoah 核心设计1. Brooks Pointer转发指针每个对象头额外存储一个转发指针初始指向自身对象转移时将原对象的 Brooks 指针指向新对象所有对原对象的访问通过 Brooks 指针自动重定向读屏障检查 Brooks 指针若已转移则转发转移完成后后台线程逐步更新所有引用对象头结构┌────────────────────────────────────────┐│ mark_word │ 标记字 ││ klass_ptr │ 类指针 ││ brooks_ptr │ 转发指针Shenandoah特有│└────────────────────────────────────────┘2. 连接矩阵Connection Matrix记录 Region 之间的引用关系优化跨代引用处理减少全堆扫描3. 读写屏障读屏障读取对象引用时检查 Brooks 指针写屏障记录引用变化更新卡表与 ZGC 对比ZGC 只有读屏障Shenandoah 有读写屏障Shenandoah 回收流程阶段 1初始标记Init Mark—— STW 1ms标记 GC Roots 直接引用阶段 2并发标记Concurrent Marking—— 并发遍历对象图标记存活对象阶段 3最终标记Final Mark—— STW 1ms处理并发标记期间的引用变化阶段 4并发清理Concurrent Cleanup—— 并发清理垃圾 Region阶段 5并发转移Concurrent Evacuation—— 并发复制存活对象到新的 Region更新 Brooks 指针旧对象 → 新对象读屏障自动转发访问阶段 6并发更新引用Concurrent Update References—— 并发更新所有指向旧地址的引用分代 ShenandoahJDK 24 实验性JDK 25 正式分代模式吞吐量提升 ~30%相比单代停顿时间 1~5ms典型偶尔 ~10ms支持压缩指针Compressed Oops内存开销比 ZGC 低JDK 25 不再需要 -XX:UnlockExperimentalVMOptionsShenandoah 参数参数说明-XX:UseShenandoahGC开启 Shenandoah-XX:ShenandoahGCModegenerational分代模式JDK 25 默认-XX:ShenandoahGCHeuristicsmode启发式模式adaptive/static/compact-XX:ShenandoahPacingpacing 控制分配速率八、GC 收集器全维度对比表2026 JDK 25维度SerialParallelCMSG1ZGC(分代)Shenandoah(分代)JDK 支持所有所有所有71112默认状态淘汰JDK8默认已废弃JDK9默认可选可选(OpenJDK)回收区域年轻/老年轻/老老年代整堆整堆整堆核心算法复制/整理复制/整理标记-清除Region混合染色指针读屏障Brooks指针工作模式串行STW并行STW并发并发STW全并发全并发典型停顿100ms100ms1s20-200ms0.1-0.5ms1-5ms最坏停顿秒级秒级秒级500ms1ms~10ms吞吐量(vs G1)低最高中基准-5~15%-5~10%内存开销(vs G1)低低中基准15~30%10~20%CPU开销(vs G1)低低中基准5~10%5~15%压缩指针支持支持支持支持不支持支持最佳堆范围2GB任意4-16GB4-32GB32GB-多TB8-64GB内存碎片无无严重无无无适用场景客户端批处理低停顿(JDK8)通用超低延迟低延迟容器2026 推荐❌❌❌✅ 默认✅ 延迟敏感✅ OpenJDK九、GC 收集器选择决策树2026JDK 版本建议JDK 版本推荐收集器JDK 8G1-XX:UseG1GC或 CMS遗留系统JDK 11~16G1默认可选 ZGC实验性JDK 17~21G1默认ZGC正式Shenandoah实验性JDK 22G1默认分代 ZGC唯一模式分代 Shenandoah正式关键原则先测后选用实际负载测试不同收集器监控指标GC 停顿时间、吞吐量、内存碎片、CPU 使用率渐进升级JDK 8 → JDK 17/21 LTS逐步验证避免过度优化G1 已满足大多数场景十、关键概念深度解析1. STWStop The WorldGC 期间暂停所有应用线程所有收集器都有 STW 阶段只是长短不同Serial/Parallel全程 STWCMS初始标记 重新标记 STWG1初始标记 重新标记 混合回收 STWZGC/Shenandoah仅初始标记 STW 1ms2. 吞吐量 vs 低延迟指标定义追求代表吞吐量用户代码运行时间 / 总时间单位时间内完成更多工作Parallel Scavenge低延迟单次 GC 停顿时间响应速度用户体验ZGC、Shenandoah3. 内存碎片算法碎片情况代表标记-清除产生碎片CMS标记-整理无碎片Serial Old、Parallel Old、G1复制无碎片Serial、ParNew、Parallel Scavenge碎片导致大对象分配失败触发 Full GC。4. 写屏障Write Barriervs 读屏障Load Barrier屏障类型触发时机作用代表写屏障对象引用写入时记录引用变化CMS增量更新、G1SATB、Shenandoah读屏障读取对象引用时检查/转发对象状态ZGC染色指针、ShenandoahBrooks Pointer屏障有性能开销但实现并发 GC 的关键。5. 三色标记算法颜色含义状态白色未访问垃圾对象灰色已访问引用未完全扫描待处理黑色已访问引用完全扫描存活对象并发标记问题黑→白引用被切断白对象被误回收CMS 解决增量更新关注新增引用G1/ZGC 解决SATB关注旧值保守但安全6. 弱分代假说Weak Generational Hypothesis大部分对象朝生夕死在年轻代被回收熬过多次 GC 的对象很难死亡进入老年代分代设计的理论基础年轻代频繁回收老年代低频回收