Go 面试突击:GC、内存管理与性能调优 20 题
GC 是 Go 后端面试必问,考察"实战优化意识"。本文梳理 20 道经典 GC 与性能题。
一、GC 基础
Q1. Go GC 是哪种算法?
并发三色标记 + 写屏障。
Q2. GC 几个阶段?
Mark Setup → Marking → Mark Termination → Sweep。
Q3. 什么是 STW?
Stop-The-World,整个进程暂停。
Q4. 1.5 之前 GC 的痛点?
单核 STW,最长几十秒。
Q5. 1.5 之后最大改进?
并发 mark + write barrier,STW < 1ms。
Q6. 什么是触发 GC?
堆大小增长超过阈值。
Q7. 阈值怎么算?
根据 GOGC、之前堆大小预测。
Q8. 主动调用 GC?
runtime.GC(),仅在测试和特殊场景下。
二、写屏障
Q9. 什么是写屏障?
并发 GC 中,业务代码修改引用时调用的 hook。
Q10. Dijkstra 风格 vs Yuasa 风格?
Go 用 Dijkstra 风格的插入屏障。
Q11. 写屏障带来多少开销?
约 5%。
三、内存调优
Q12. GOGC 默认多少?
100(堆增 100% 时触发 GC)。
Q13. GOGC 越大越慢还是越快?
越大 → GC 触发频率低 → CPU 占用低,但峰值延迟可能高。
Q14. GOMEMLIMIT 含义?
对堆可分配大小上限,配合 GOGC 一起调。
Q15. sync.Pool 是避 GC 工具?
是。它循环复用对象,避免临时对象。
Q16. 什么场景用 sync.Pool?
高频临时对象:bytes.Buffer、sql.Row、protobuf Message。
Q17. 怎样减少堆分配?
- 复用对象
- slice 预分配
- 避免返回 interface
- 避免 boxing
四、性能调优
Q18. pprof 三大方法?
- runtime/pprof:程序内
- net/http/pprof:远程拉
- go test -bench:基准
Q19. trace 三大要素?
goroutine、heap、thread。
Q20. 性能调优顺序?
- 找到瓶颈(top -cum)
- 针对性优化
- benchmark 验证
- trace 验证调度
五、实战
debug.SetGCPercent(200)// 高并发、低 GC 触发频率debug.SetMemoryLimit(2<<30)// 容器内存限额保护六、避坑清单
- 不要在生产用
runtime.GC()——会激增 STW - 减少 reflection——慢且耗内存
- 小心 closure 持有外部指针——延迟释放
七、总结与展望
GC 和性能调优需要"理论 + 实测"结合。掌握 GOGC / GOMEMLIMIT / sync.Pool / pprof 几件套,能让你在生产中独立优化一个服务。
未来:Go 团队的"分代 GC"已在路线图,会让 GC 更高效。
八、参考文献
- runtime/mgc.go
- Go 官方 blog:1.5 concurrent GC
- 阿里 Go 性能调优案例