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