土法炼钢兴趣小组的算法知识备份

现代 GC 技术前沿:低延迟与智能化

目录

引言

随着服务器内存越来越大(TB 级别),传统的 STW (Stop The World) 垃圾收集器(如 G1, CMS)面临巨大挑战。停顿时间与堆大小成正比,导致大堆下的停顿可能达到秒级甚至分钟级。现代 GC (ZGC, Shenandoah) 的目标是将停顿时间控制在 10ms 以内,且不随堆大小增加而增加。

1. 染色指针 (Colored Pointers) - ZGC 的核心

ZGC 创新性地将对象的状态信息存储在指针本身,而不是对象头中。这利用了 64 位架构中未使用的地址位。

ZGC Colored Pointers

1.1 虚拟地址映射

在 Linux x86-64 上,ZGC 通过多重映射 (Multi-Mapping) 将同一个物理内存页映射到三个不同的虚拟地址空间: * Marked0: 视图 0 * Marked1: 视图 1 * Remapped: 视图 2

这三个视图指向同一块物理内存,但指针的颜色位不同。

1.2 优势

2. 读屏障 (Load Barrier)

为了支持并发整理(在用户线程运行时移动对象),ZGC 使用了读屏障。

2.1 汇编级原理

当 Java 代码执行 Object val = obj.field; 时,JIT 编译器会插入类似如下的汇编指令:

; 伪汇编代码
mov rax, [obj + field_offset] ; 读取引用
test rax, bad_mask            ; 检查颜色位 (AND 操作)
jnz slow_path                 ; 如果颜色不对,跳转到慢路径
; fast path: 引用有效,继续执行

2.2 慢路径 (Slow Path)

如果指针颜色不对(例如指向了旧的地址,而对象已经被移动),慢路径会: 1. 查询转发表 (Forwarding Table)。 2. 找到对象的新地址。 3. 更新该指针(自愈 Self-Healing)。 4. 返回新对象的引用。

3. 栈水位控制 (Stack Watermark)

ZGC 在处理线程栈时,引入了 Stack Watermark 机制,实现了并发栈扫描。 * GC 不需要一次性扫描完整个栈。 * 当线程从栈帧返回 (Return) 时,如果跨越了”水位线”,屏障会触发并扫描该栈帧。 * 这进一步减少了 STW 时间。

4. AI 驱动的 GC 调优

传统的 GC 调优依赖经验法则(如调整新生代比例、晋升阈值)。现代系统开始引入机器学习。

4.1 自动调优

4.2 实例

Google 的 Pellucid 项目尝试使用 ML 预测内存分配模式,提前触发 GC 或调整堆大小,避免 Full GC。

总结

现代 GC 技术正在向硬件协同(利用虚拟内存特性)和智能化方向发展。 * ZGC/Shenandoah: 彻底解决了大堆停顿问题。 * AI: 让 GC 变得”自适应”,减少人工运维成本。


By .