标准答案

  1. GC 频率与分配速率、存活堆、GOGC 和内存限制有关。
  2. 高分配速率、短命对象过多或堆目标设置不合理会增加 GC CPU 和尾延迟。
  3. 观察 heap in use、alloc rate、GC pause、goroutine、CPU 和 P99 的时间关联。
  4. 先减少无界缓存、重复序列化和大对象,再调整 GOGC 或内存上限。

题目解析

Go GC 会根据分配速率、存活堆和 GOGC 目标安排并发标记和清扫。减少 GC 次数可能意味着更大的堆和更高 RSS,不一定改善 P99 或总成本。

排查要对齐 heap in use、alloc rate、GC CPU、暂停、goroutine、系统内存和请求 P99。短命对象过多、重复序列化、无界缓存和大 buffer 的根因不同。

先限制数据和并发生命周期,再调整 GOGC、内存上限或对象分配。任何配置变化都要在目标容器和真实流量下比较吞吐、延迟和 OOM 风险。

常见误区

  • 误区:只调 GOGC。改正:先看分配、存活对象和缓存,结合 GC CPU、RSS 和 P99 调整。
  • 误区:只看暂停时间不看 GC CPU。改正:并发 GC 也会消耗 CPU,需同时观察吞吐和下游压力。
  • 误区:把所有内存增长归因于 GC。改正:区分堆、goroutine 栈、Buffer、连接和 native 内存。

作者信息