GC模式

101 阅读3分钟

GC模式

在 JDK 21 中,ZGC 通过引入 分代收集(Generational ZGC) 机制,显著优化了垃圾回收效率。其 GC 模式主要分为以下两类,分别针对不同代际的对象进行回收:


🔄 一、Minor Collection(年轻代回收)

目标:仅回收年轻代(Young Generation)中的短期存活对象。

触发条件

  • 年轻代空间不足(对象分配速率高)。
  • 周期性触发(基于自适应算法预测)。

工作流程

  1. 并发标记
    • 遍历年轻代对象图,标记存活对象。
    • 通过 Remembered Set 记录老年代指向年轻代的引用(避免全堆扫描)。
  2. 对象移动
    • 将存活对象复制到新的年轻代 Region 或晋升至老年代。
    • 更新引用关系(通过读屏障自动修正指针)。
  3. 空间释放
    • 回收死亡对象占用的 Region,内存立即可用。

特点

  • 低延迟:停顿时间 <1ms,仅涉及年轻代。
  • 高效跨代处理:依赖 Remembered Set 解决跨代引用问题,减少扫描范围。

🔄 二、Major Collection(老年代回收)

目标:回收整个堆(含老年代和年轻代)。

触发条件

  • 老年代空间占用超过阈值(默认由分代 ZGC 自动计算)。
  • 年轻代回收后老年代仍不足。

工作流程

  1. 联合标记
    • 先执行一次 Minor Collection,再标记老年代存活对象。
  2. 重定位与压缩
    • 将老年代存活对象迁移至新 Region,合并碎片(基于标记-整理算法)。
  3. 全局引用更新
    • 通过读屏障并发更新全堆引用。

特点

  • 低频触发:频率远低于 Minor Collection(依赖对象晋升策略)。
  • 全堆并发:停顿时间仍控制为 <1ms,且吞吐量提升 10%(实测)。

⚖️ 三、模式对比与设计优势

特性Minor CollectionMajor Collection
作用范围仅年轻代全堆(年轻代+老年代)
停顿时间<1ms<1ms
跨代引用处理依赖 Remembered Set无需额外处理
内存碎片控制无碎片(复制算法)低碎片(标记-整理)
典型触发频率高(毫秒级)低(分钟级)

分代 ZGC 的核心优势

  1. 吞吐量提升
    • 分代后对象回收针对性更强,相同堆容量下吞吐量提升 4倍(相比非分代 ZGC)。
  2. 减少 Allocation Stall
    • 年轻代高频回收避免内存耗尽,阻塞触发率降低 85%
  3. 自适应调优
    • 自动管理代大小、晋升阈值等参数,无需手动配置(如 XmnXX:ConcGCThreads)。

💎 总结

JDK 21 的 ZGC 通过 Minor CollectionMajor Collection 的分代协同,实现了:

  • 年轻代高频快速回收(毫秒级并发,无 STW 瓶颈)。
  • 老年代低频全局整理(全堆压缩,避免碎片堆积)。
  • 极致低延迟与高吞吐并存(实测 P99 延迟 ≤0.1ms,吞吐量提升显著)。

调优建议:

启用分代模式需添加参数:-XX:+UseZGC -XX:+ZGenerational

监控重点:关注 GC 日志中的 Allocation Stall 频率,若出现需扩容堆(-Xmx)。

新生代GC Minor Collection

全堆GC Major Collection