一句话定义

Stop The World (STW) 是垃圾回收中的一种状态,指为了保证内存标记或清理的准确性,运行时系统(Runtime)会暂时停止所有用户协程(Goroutine)的执行。

核心原理

在 Go 的垃圾回收过程中,STW 主要发生在两个关键时刻,用于切换 GC 的状态:

1. Mark Setup (准备标记)

  • 目的:开启写屏障(Write Barrier)并扫描根对象(Root Scan)。
  • 必要性:必须确保所有处理器(P)都同步开启了写屏障,才能开始并发标记,否则会丢失引用。

2. Mark Termination (结束标记)

  • 目的:统计扫描结果,关闭写屏障,并计算下一次 GC 的触发阈值。
  • 必要性:需要一个静止的快照来确认标记阶段已经彻底完成。

性能影响与优化

STW 是导致应用 卡顿(Jitter)延迟(Latency) 的主要原因。Go 团队通过以下手段持续缩减 STW 时间:

  • 并发扫描:将大部分标记工作移出 STW,与用户代码并发执行。
  • 混合写屏障:消除了 Mark Termination 阶段重扫栈的需求,使 STW 从数百毫秒缩减至亚毫秒级。
  • 抢占式调度:确保 Goroutine 能在极短时间内响应 STW 请求,避免因某个循环任务导致 STW 无法开始。

知识扩展

  • Pacing 算法:Go 运行时根据内存分配速度自动调整 GC 频率,以平衡吞吐量和 STW 影响。
  • 安全点 (Safe Point):Goroutine 只能在特定的代码位置(如函数调用、循环跳转)响应 STW 停止请求。
  • Gctrace:通过环境变量 GODEBUG=gctrace=1 可以观察每次 GC 的 STW 耗时。