排查 Go 程序的内存泄漏(Memory Leak)是一个系统性的过程。由于 Go 带有垃圾回收(GC)机制,真正的“内存泄漏”(即内存无法被回收且无法被访问)比较少见,绝大多数情况是“逻辑泄漏”,即对象依然被引用(Reachable),导致 GC 无法回收它们,但程序逻辑上其实已经不再需要这些对象了。 以下是排查 Go 内存泄漏的完整步骤和指南: --- 第一阶段:确认是否存在泄漏 在深入代码之前,先通过监控确认内存是否真的在持续增长且不下降。 1. 观察指标: RSS (Resident Set Size): 操作系统视角的物理内存占用。 Go Heap Inuse: Go Runtime 实际使用的堆内存。 2. 判断标准: 如果 RSS 持续上涨,且在业务低峰期(或强制 GC 后)没有明显回落,通常存在泄漏。 如果 RSS 很高,但 很低,可能是内存碎片或 非 Go 内存泄漏(如 CGo)。 --- 第二阶段:使用 pprof 进行定位(核心步骤) 是 Go 官方提供的最强大的性能分析工具。 1. 开启 pprof 在代码中引入 : 2. 抓取 Heap Profile ...