一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JVM中Shenandoah与G1在跨Region引用维护以及并发标记阶段的相似与相异性

时间:2026-07-09 12:14:58 编辑:袖梨 来源:一聚教程网

Shenandoah使用连接矩阵替代G1的记忆集以降低跨Region引用维护开销:前者为全局二维布尔表,仅记录Region级引用关系,避免伪共享和高内存占用;后者为每个Region独立维护的哈希表,精度高但开销大。

Shenandoah 与 G1 在跨 Region 引用维护和并发标记阶段既有明显继承关系,也有关键设计取舍——前者重在降低开销、支持全并发,后者更侧重分代精度与吞吐平衡。

跨 Region 引用维护:连接矩阵 vs 记忆集

G1 使用每个 Region 独立维护的“记忆集”(Remembered Set),本质是哈希表结构,记录本 Region 中对象指向其他 Region 的引用。这种细粒度设计能精准定位脏卡,但代价高:需占用堆内存 10%–20%,且频繁更新易引发伪共享和写屏障开销。

Shenandoah 则完全摒弃记忆集,改用全局“连接矩阵”(Connection Matrix)——一张二维布尔表,行与列均代表 Region。若 Region A 中有任意对象引用 Region B 中的对象,就在 matrix[A][B] 标记为 true。

  • 连接矩阵不追踪具体字段或对象,只记录 Region 级引用关系,颗粒度更粗
  • 无需每个 Region 单独计算和同步维护,内存开销显著降低(
  • 因 GC 全程并发,粗粒度带来的额外扫描成本可被多线程并行摊薄,属于对吞吐的主动妥协

并发标记阶段:流程一致,但目标约束不同

两者都采用三色标记法 + SATB(Snapshot-At-The-Beginning)快照机制,阶段划分高度相似:初始标记(STW)、并发标记(用户线程运行中遍历对象图)、最终标记(短暂 STW,处理剩余增量引用)。

区别在于标记结果的后续用途:

  • G1 的标记结果服务于分代回收决策:区分新生代/老年代 Region,决定哪些 Region 进入年轻代 GC 或混合 GC
  • Shenandoah 不分代,标记结果直接用于筛选“回收价值最高”的 Region 组成回收集(Collection Set),且该集合可能包含任意 Region,无年龄假设
  • 由于 Shenandoah 后续要并发移动对象,其并发标记还需配合 Brooks 指针与读屏障,确保标记过程中对象地址变更不会导致漏标

实际影响:停顿时间与适用场景分化

连接矩阵 + 无分代 + 并发整理,让 Shenandoah 把 STW 时间压到毫秒级(典型 5–50ms),尤其适合堆大(数十 GB 至 TB 级)、延迟敏感的场景,如实时风控、高频交易网关。

G1 虽在 JDK 17+ 后持续优化,但其记忆集维护和部分 STW 回收阶段仍导致停顿更长(10–500ms),更适合对吞吐要求略高、能接受中等延迟的通用服务。

两者在标记逻辑上共享大量代码,说明 Shenandoah 确实是 G1 的演进而非推倒重来——只是把“如何减少停顿”放在了绝对优先位置。

热门栏目