GC模式
在 JDK 21 中,ZGC 通过引入 分代收集(Generational ZGC) 机制,显著优化了垃圾回收效率。其 GC 模式主要分为以下两类,分别针对不同代际的对象进行回收:
🔄 一、Minor Collection(年轻代回收)
目标:仅回收年轻代(Young Generation)中的短期存活对象。
触发条件:
- 年轻代空间不足(对象分配速率高)。
- 周期性触发(基于自适应算法预测)。
工作流程:
- 并发标记:
- 遍历年轻代对象图,标记存活对象。
- 通过 Remembered Set 记录老年代指向年轻代的引用(避免全堆扫描)。
- 对象移动:
- 将存活对象复制到新的年轻代 Region 或晋升至老年代。
- 更新引用关系(通过读屏障自动修正指针)。
- 空间释放:
- 回收死亡对象占用的 Region,内存立即可用。
特点:
- 低延迟:停顿时间 <1ms,仅涉及年轻代。
- 高效跨代处理:依赖 Remembered Set 解决跨代引用问题,减少扫描范围。
🔄 二、Major Collection(老年代回收)
目标:回收整个堆(含老年代和年轻代)。
触发条件:
- 老年代空间占用超过阈值(默认由分代 ZGC 自动计算)。
- 年轻代回收后老年代仍不足。
工作流程:
- 联合标记:
- 先执行一次 Minor Collection,再标记老年代存活对象。
- 重定位与压缩:
- 将老年代存活对象迁移至新 Region,合并碎片(基于标记-整理算法)。
- 全局引用更新:
- 通过读屏障并发更新全堆引用。
特点:
- 低频触发:频率远低于 Minor Collection(依赖对象晋升策略)。
- 全堆并发:停顿时间仍控制为 <1ms,且吞吐量提升 10%(实测)。
⚖️ 三、模式对比与设计优势
| 特性 | Minor Collection | Major Collection |
|---|---|---|
| 作用范围 | 仅年轻代 | 全堆(年轻代+老年代) |
| 停顿时间 | <1ms | <1ms |
| 跨代引用处理 | 依赖 Remembered Set | 无需额外处理 |
| 内存碎片控制 | 无碎片(复制算法) | 低碎片(标记-整理) |
| 典型触发频率 | 高(毫秒级) | 低(分钟级) |
分代 ZGC 的核心优势:
- 吞吐量提升:
- 分代后对象回收针对性更强,相同堆容量下吞吐量提升 4倍(相比非分代 ZGC)。
- 减少 Allocation Stall:
- 年轻代高频回收避免内存耗尽,阻塞触发率降低 85%。
- 自适应调优:
- 自动管理代大小、晋升阈值等参数,无需手动配置(如
Xmn、XX:ConcGCThreads)。
- 自动管理代大小、晋升阈值等参数,无需手动配置(如
💎 总结
JDK 21 的 ZGC 通过 Minor Collection 和 Major Collection 的分代协同,实现了:
- ✅ 年轻代高频快速回收(毫秒级并发,无 STW 瓶颈)。
- ✅ 老年代低频全局整理(全堆压缩,避免碎片堆积)。
- ✅ 极致低延迟与高吞吐并存(实测 P99 延迟 ≤0.1ms,吞吐量提升显著)。
调优建议:
启用分代模式需添加参数:
-XX:+UseZGC -XX:+ZGenerational。监控重点:关注 GC 日志中的
Allocation Stall频率,若出现需扩容堆(-Xmx)。