核心解答

Go 语言的 GC(垃圾回收)采用的是 三色标记清除算法,并配合 混合写屏障。虽然它被设计为“并发”回收,但仍存在几个关键的 STW (Stop The World) 阶段和导致卡顿的场景:

  1. STW 阶段:开启写屏障(Mark Setup)和 统计扫描结果(Mark Termination)时。
    • 延长 STW 的因素:如果存在大量活跃的 Goroutine 或 P(GOMAXPROCS 过大),或者某些 Goroutine 处于无法被抢占的状态(如死循环),会导致 STW 等待时间显著增加。
  2. 辅助回收 (Mark Assist):当用户代码分配内存的速度快于 GC 回收速度时,Goroutine 会被强制参与 GC 标记工作。
  3. 扫描栈空间:虽然栈扫描是并发的,但在扫描某个特定 Goroutine 的栈时,该 Goroutine 会被挂起。
  4. 系统级压力:大对象分配、海量指针对象、或者内存碎片严重时,GC 压力剧增导致整体吞吐下降。

解答思路

回答此问题应遵循“从机制到场景”的逻辑:

  1. 明确机制:指出 Go GC 并非完全没有卡顿,而是通过并发设计极大地缩短了 STW 时间(通常在亚毫秒级)。
  2. 分析 STW:解释 GC 流程中必须暂停所有 P 的两个关键点。
  3. 引入辅助机制:说明 Mark Assist 如何在内存分配压力大时影响应用性能。
  4. 边界情况:列举会导致 GC 效率低下的具体业务场景(如海量小对象)。

深度解析与面试技巧