Shenandoah实现低延迟的核心在于将标记、清理、回收等GC工作全程并发执行,仅初始与最终标记需毫秒级STW;通过连接矩阵替代记忆集、Brooks指针加读屏障解决并发移动难题,并默认不分代以简化逻辑。
Shenandoah 实现低延迟的核心,在于把绝大部分 GC 工作移到与用户线程并发执行,大幅压缩“Stop-The-World”(STW)时间,且停顿长短基本不随堆大小或存活对象数量增长。
它将传统上必须暂停应用才能完成的标记、清理、对象移动等步骤,全部设计为可并发运行。例如:
G1 为追踪跨 Region 引用,需维护开销高昂的记忆集(Remembered Set),内存和 CPU 消耗随 Region 数量增长。Shenandoah 改用“连接矩阵”——一张二维布尔表,RegionN → RegionM 有引用就在 (N,M) 格打标。这种全局结构:
对象在被复制过程中,用户线程可能仍在访问旧地址。Shenandoah 在每个对象头前插入一个转发指针(Brooks Pointer),并通过读屏障拦截所有对象读取操作:
它不区分新生代/老年代 Region,所有 Region 统一评估回收价值。这带来两个直接好处: