必须选Memory (heap)才有堆数据,因GoLand默认仅CPU分析;需在Run→Edit Configurations中启用Profiling并下拉选择Memory (heap),同时代码用_ "net/http/pprof"注册且ListenAndServe端口一致。

GoLand Profile 配置必须选 Memory (heap) 才有堆数据
点完 GoLand 的 Profile 按钮后界面空白或提示 Failed to fetch profile,90% 是因为没手动切换分析类型。GoLand 默认只做 CPU profiling,/debug/pprof/heap 根本不会被请求——它压根不拉。
必须进 Run → Edit Configurations… → 勾选 Enable profiling → 下拉菜单明确选 Memory (heap):
- 别选
Allocations:它统计的是所有分配过的内存(含已 GC 掉的),对泄漏排查无效 - 别留空或选默认项:那等同于 CPU 分析,
heap端点不会触发 - 如果项目用
dlv启动、或自定义构建脚本(如 make run),GoLand 的 profiling 注入会失效,此时得切回命令行:go tool pprof http://localhost:6060/debug/pprof/heap
代码里注册 pprof 必须用 _ "net/http/pprof" 且端口一致
GoLand 不采集数据,它只发 HTTP 请求;真正暴露 /debug/pprof/* 接口的是你代码里的注册逻辑。最简可靠写法:
import _ "net/http/pprof"
func main() {
go http.ListenAndServe("127.0.0.1:6060", nil)
// …
}
关键点:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 导入必须是
_ "net/http/pprof"(下划线导入),否则 handler 不注册 -
ListenAndServe第二个参数传nil,让标准库自动挂载全部/debug/pprof/*路由 - 端口必须和 GoLand 配置里填的一致(比如配置填了
6060,代码就得是"127.0.0.1:6060");填错就连接失败 - 别写
"0.0.0.0:6060":本地调试用127.0.0.1更稳,避免 hostname 解析失败或端口冲突 - 验证是否生效:
curl -v http://127.0.0.1:6060/debug/pprof/,返回 HTML 页面才算挂上;404 就说明没注册成功
GoLand pprof 界面里怎么看哪个 struct 占内存最多
默认视图展示的是 Allocated Space(总分配量),容易误判——比如一个函数高频 new 小对象但立刻被 GC,它排名很高,却不是泄漏源。
真要定位泄漏,必须切到 Inuse Space(GC 后仍存活的对象所占空间):
- 左上角下拉菜单 → 选
Inuse Space - 切到
Call Tree或Hot Spots标签 - 找
flat值最高的节点,点开看右侧Source - 重点关注:往全局
map插值、往未关闭的channel发送、或长期持有[]byte/struct{}实例的代码行
可视化依赖 graphviz 必须装好且 GoLand 重启才生效
想用 web 命令生成调用图,或在 GoLand 里点 View → Flame Graph,底层依赖 graphviz 的 dot 工具。常见坑:
- Mac 上用
brew install graphviz后,必须检查dot -version是否能执行;若报 command not found,说明 PATH 没生效 - Windows 安装时务必勾选 “Add Graphviz to the system PATH”,否则 GoLand 找不到
- 安装完必须重启 GoLand——IDE 启动时才读一次环境变量,不重启永远识别不了
dot - 如果只用
top/list/source这类文本命令,graphviz 不是必需的
复杂点在于:Inuse Space 切换和 graphviz 重启这两步,漏掉任意一个,pprof 界面就只剩一堆数字,看不出谁在吃内存。

















