GoLand 默认不采集堆内存数据,需手动切换至 Memory (heap) 模式并确保代码正确暴露 /debug/pprof/heap 接口(导入 _ "net/http/pprof" 且启动 http.ListenAndServe("127.0.0.1:6060", nil)),否则无法获取 heap 信息。

GoLand 默认不采集堆内存数据,点 Profile 按钮后看不到 heap 信息,是因为它默认只做 CPU profiling;必须手动切换到 Memory (heap) 模式,并确保代码已正确暴露 /debug/pprof/heap 接口,否则整个流程就卡在第一步。
GoLand 的 profiling 配置必须选 Memory (heap),不能留空或选 Allocations
GoLand 的 Run → Edit Configurations… → Profiling 设置里,默认下拉菜单是 CPU。这个选项完全不碰堆内存,自然抓不到泄漏线索。你得手动改成 Memory (heap):
- 勾选
Enable profiling - 从下拉菜单中明确选择
Memory (heap)—— 别选Allocations,它统计的是历史总分配量(alloc_space),对泄漏排查基本无效 - 如果下拉菜单灰掉,说明当前运行配置不是 Go Application 类型,或用了 dlv 启动、自定义构建脚本,此时 GoLand 的 profiling 注入会失效,得切回命令行方式
代码里必须用 _ "net/http/pprof" + http.ListenAndServe("127.0.0.1:6060", nil)
GoLand 不负责暴露 profile 接口,它只是发请求;真正提供 /debug/pprof/heap 的是你自己的代码。最简可靠写法只有两行:
- 导入必须是
import _ "net/http/pprof"(带下划线),否则 handler 不注册 - 监听必须是
go http.ListenAndServe("127.0.0.1:6060", nil)—— 第二个参数传nil才能自动挂载所有/debug/pprof/*路由 - 别写
"0.0.0.0:6060",本地调试用127.0.0.1更稳,避免 hostname 解析失败或端口冲突 - 验证是否生效:执行
curl -v http://127.0.0.1:6060/debug/pprof/,返回 HTML 页面才算成功;404 就说明没挂上
Profile 界面里要切到 Inuse Space 才能看真实泄漏
GoLand 分析界面默认展示的是 Allocated Space(历史总分配),容易误判。内存泄漏只关心 GC 后还活着的对象,也就是 Inuse Space:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 左上角下拉菜单 → 选
Inuse Space - 切到
Call Tree或Hot Spots标签 → 找flat值最高的节点 - 点开函数后看右侧
Source,重点关注三类代码行:往全局 map 插值、往未关闭的 channel 发送、长期持有 []byte / struct{} 实例 - 如果 top 里全是
runtime.mallocgc,别慌——它只是入口,真凶一定在它的调用栈上层
线上或复杂场景建议直接用命令行 go tool pprof
GoLand 的 profiling 在以下情况大概率失效:
- 用了
dlv启动(比如调试时加了--headless) - 用了自定义构建脚本或 Makefile 启动服务
- 服务跑在容器里,GoLand 无法直连
127.0.0.1:6060
这时直接用命令行更可控:
- 先确认接口可用:
curl -s "http://localhost:6060/debug/pprof/heap?inuse_space=1" > heap1.pb.gz - 等 2–5 分钟再采一次:
curl -s "http://localhost:6060/debug/pprof/heap?inuse_space=1" > heap2.pb.gz - 比对差异:
go tool pprof -base heap1.pb.gz heap2.pb.gz,进交互后输top,再输list 函数名定位具体行 - 注意:离线分析必须带上原始二进制文件,否则函数名会变成
goph.newunknown这种无法定位的符号
最容易被忽略的一点是:GoLand 的 profiling 界面不会自动触发 GC,也不会加 ?gc=1 或 ?inuse_space=1 参数;它只是按固定路径请求 /debug/pprof/heap。如果你的代码没配好、端口不对、或 handler 没注册,它连第一个字节都拿不到——空白页或 “Failed to fetch profile” 提示,90% 是这一步漏了。

















