Golang程序调试 -- 内存泄漏pprof工具
代码引入pprof
import (
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
http.ListenAndServe("0.0.0.0:60001", nil)
}()
//...
select {}
}
上述事例我暴露出得端口号为60001,可自定义一个未使用的端口号即可
WEB访问模式
直接打开浏览器输入http://ip:60001/debug/pprof
上述的IP为程序所执行的环境暴露的IP地址;
命令行模式定位内存
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/heap
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.malg
命令行模式定位耗时
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/profile
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject
命令行模式定位内存分配
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/allocs
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject
# 命令行模式定位协程泄漏
```shell
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/goroutine
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject
# 命令行模式定位锁竞争
```shell
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/mutex
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject