Go GC 为什么能做到低延迟?一次源码级深度剖析
但在今天的 Go 中,你会发现一个非常惊人的事实:
Go 的 GC 在百万 QPS 服务下,STW 时间可以控制在亚毫秒级。
它是怎么做到的?
这篇文章我们从 runtime 源码出发,拆解 Go GC 低延迟的核心设计。
一、先打破一个误区:Go GC 并不“快”
高吞吐 GC:允许长时间 STW,但整体扫描效率高
二、Go GC 的核心架构:三色标记 + 并发标记
三色标记-清除算法(Tri-color Mark-Sweep)
这套算法本身并不新,但 Go 的关键在于:并发执行标记阶段
三、为什么早期 GC 延迟高?
四、Go 如何压缩 STW?
五、写屏障:并发标记的核心保障
并发标记的最大问题:标记过程中,程序还在修改指针。
Go 引入了:写屏障(Write Barrier)
gcWriteBarrier(ptr, newObj)
混合写屏障(Hybrid Write Barrier)
六、GC 与调度器深度耦合
GC worker 以 goroutine 形式运行:
七、STW 为什么能做到亚毫秒?
八、GC Pacer:控制频率,而不是等内存爆炸
GC Pacer
目标堆大小 = 当前存活堆 × (1 + GOGC/100)
九、并发清除:彻底避免长暂停
十、为什么 Go GC 仍然不是“最快”的?
十一、与其他语言的对比
Java 有 G1/ZGC,延迟也很低,但复杂度极高
十二、总结:Go GC 低延迟的五大核心原因