GC 协助标记 (Mark Assist) 是 Go 语言并发垃圾回收中的一种背压(Backpressure)机制。
简要说明如下:
- 核心逻辑:当一个 Goroutine 分配内存的速度超过了 GC 后台扫描的速度时,Go 运行时会扣除该协程的“信用分”。
- 强制干活:如果信用分为负,该协程会被强制暂停当前的业务逻辑,转去帮 GC 执行扫描标记工作。
- 主要目的:防止堆内存因分配过快而失去控制(避免 OOM),确保标记阶段能在内存达到阈值前完成。
- 对应用的影响:
- 非 STW:它不会停顿整个程序,只影响分配过快的特定协程。
- 性能损耗:会导致受影响的业务请求响应时间(Latency)显著变长,通常是 P99 延迟抖动的主要原因。
一句话总结:“谁分配太快,谁就得停下来帮 GC 扫垃圾。”