☰
Go 面试突击:GC、内存管理与性能调优 20 题
2026/9/30 7:10:28 网站建设 项目流程

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. 性能调优顺序?

  1. 找到瓶颈(top -cum)
  2. 针对性优化
  3. benchmark 验证
  4. trace 验证调度

五、实战

debug.SetGCPercent(200)// 高并发、低 GC 触发频率debug.SetMemoryLimit(2<<30)// 容器内存限额保护

六、避坑清单

  1. 不要在生产用runtime.GC()——会激增 STW
  2. 减少 reflection——慢且耗内存
  3. 小心 closure 持有外部指针——延迟释放

七、总结与展望

GC 和性能调优需要"理论 + 实测"结合。掌握 GOGC / GOMEMLIMIT / sync.Pool / pprof 几件套,能让你在生产中独立优化一个服务。

未来:Go 团队的"分代 GC"已在路线图,会让 GC 更高效。

八、参考文献

  • runtime/mgc.go
  • Go 官方 blog:1.5 concurrent GC
  • 阿里 Go 性能调优案例

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询