Region的分类和使用途径

8 阅读4分钟

Region的分类和使用途径

在 JDK 21 的分代 ZGC(Generational ZGC)中,Region 是内存管理的基本单元,其分类和使用途径是 ZGC 实现低延迟和高吞吐的核心设计。以下是基于分代模型的详细解析:


⚙️ 一、Region 的分类

ZGC 将堆内存划分为三类 Region,每类针对不同大小的对象优化:

  1. 小型 Region(Small Region)
    • 容量:固定 2MB
    • 用途:存放 < 256KB 的小对象(如临时变量、短生命周期对象)。
    • 分代适配
      • 年轻代:主要分配小型 Region,因年轻代对象多为小对象且生命周期短。
      • 老年代:少量小型 Region 用于存放大对象晋升后的小型子对象。
  2. 中型 Region(Medium Region)
    • 容量:固定 32MB
    • 用途:存放 256KB ~ 4MB 的中型对象(如缓存、中型集合)。
    • 分代适配
      • 年轻代:较少使用(年轻代中型对象较少)。
      • 老年代:核心区域,存放长期存活的中型对象,通过连续空间减少碎片。
  3. 大型 Region(Large Region)
    • 容量:动态调整(N × 2MB,最小 4MB
    • 用途:存放 ≥ 4MB 的大对象(如大型数组、流数据)。
    • 特性
      • 独占性:每个 Large Region 仅存放一个大对象,避免外部碎片。
      • 分代适配
        • 年轻代:几乎不使用(大对象直接晋升老年代)。
        • 老年代:大对象专属区域,回收时需特殊处理(避免复制开销)。

🔍 二、Region 的使用途径

1. 分代策略与 Region 的关联

  • 年轻代(Young Generation)
    • 主要 Region 类型小型 Region 为主(>90%),辅以少量中型 Region。
    • 分配逻辑:新对象优先在年轻代的小型 Region 分配;若对象 ≥ 256KB,则分配至中型 Region。
    • 回收机制:Minor GC 仅扫描年轻代 Region,通过 复制算法 将存活对象晋升至老年代或年轻代其他 Region。
  • 老年代(Old Generation)
    • Region 组合:混合使用三类 Region,以中型 Region 为主(兼顾连续性与碎片控制)。
    • 大对象处理:≥4MB 对象直接分配至老年代的大型 Region,避免年轻代复制开销。
    • 回收机制:Major GC 并发扫描全堆,但通过 记忆集(Remembered Set) 减少跨代引用扫描范围。

2. Region 的动态转换机制

  • 小型 ↔ 中型 Region 转换
    • 年轻代回收后,空闲的小型 Region 可合并为中型 Region(减少碎片)。
    • 老年代的中型 Region 碎片化后,可拆分为小型 Region 重用。
  • 大型 Region 释放
    • 大对象死亡后,其占用的 Large Region 直接释放回全局池,可重新分配为其他类型 Region。

3. 分代回收对 Region 的优化效果

  • 减少扫描范围
    • Minor GC 仅扫描年轻代 Region(小型+少量中型),避免全堆扫描,吞吐量提升 40%+(京东实测)。
  • 降低碎片率
    • 年轻代高频回收释放的小型 Region 可快速重用;
    • 老年代中型 Region 连续分配策略使内存碎片率 <5%(对比非分代 ZGC 降低 30%)。

⚡️ 三、性能对比:分代 vs 非分代 ZGC 的 Region 使用

维度分代 ZGC(JDK 21+)非分代 ZGC(JDK 20-)
Region 扫描范围年轻代仅扫小型/中型 Region;老年代按需扫描全堆扫描所有 Region
大对象处理直接分配老年代大型 Region,避免年轻代复制全堆混合分配,复制开销大
碎片控制年轻代 Region 快速重用;老年代中型 Region 连续分配全堆统一管理,碎片率较高(需预留 20% 空间)
吞吐量影响提升 40-400%(对象短命场景)基准值

💎 总结

  • Region 分类的本质:通过 物理隔离不同尺寸对象,结合分代生命周期特征,最大化内存利用率与回收效率。
  • 分代的核心优化
    • 年轻代聚焦 小型 Region 高频回收,实现亚毫秒级 Minor GC(<1ms);
    • 老年代依托 中型 Region 连续分配大型 Region 独占式管理,兼顾低碎片与高吞吐。
  • 调优建议
    • 监控命令:jcmd <pid> GC.gen_info 查看分代 Region 分布。
    • 参数调整:通过 XX:NewRatio=3 增大年轻代比例(默认 5%),提升短命对象回收效率。