1. go build
工具
- 编译时检测:在编译Go程序时,添加
-gcflags '-m'
参数,例如:go build -gcflags '-m' main.go
。
- 分析输出:编译输出中会显示哪些变量发生了内存逃逸及原因。如
moved to heap: <变量名>
表示该变量逃逸到堆上。
2. pprof
工具
- 引入相关代码:在代码中导入
net/http
和runtime/pprof
包,并在合适位置添加代码启动pprof服务,如:
func init() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
}
- 运行程序:启动Go程序。
- 获取内存分析数据:使用
go tool pprof
命令连接到pprof服务获取内存分析数据,如go tool pprof http://localhost:6060/debug/pprof/heap
。
- 分析逃逸信息:在
pprof
交互式命令行中,使用top
等命令查看内存占用情况,结合list
等命令查看具体函数中变量的逃逸情况。
3. Goland
IDE(如果使用IDE开发)
- 开启分析:在Goland中,运行程序时选择“Profile '程序名'”,IDE会对程序进行性能分析。
- 查看内存逃逸:在性能分析结果的“Memory”标签页中,查看堆内存使用情况,IDE会标记出逃逸到堆上的变量和相关函数调用。