下载测试代码
go get
中可以获取测试程序, 注意加上 -d
避免下载后自动安装。
Github
go get -d github.com/wolfogre/go-pprof-practice cd $GOPATH/src/github.com/wolfogre/go-pprof-practice
如果 go get 下载不了, 可以 git clone 下载
gir clone https://github.com/wolfogre/go-pprof-practice
对代码进行编译
然后运行
go mod init go mod tidy
最后再运行
go build ./go-pprof-practice
运行 pprof 命令
go tool pprof http://localhost:6060/debug/pprof/heap
还是三板斧top
, list
等命令
list
命令
可以看到这次出问题的地方在 github.com/wolfogre/go-pprof-practice/animal/muridae/mouse.(*Mouse).Steal
,函数内容如下:
func (m *Mouse) Steal() { log.Println(m.Name(), "steal") max := constant.Gi for len(m.buffer) * constant.Mi < max { m.buffer = append(m.buffer, [constant.Mi]byte{}) } }
可以看到,这里有个循环会一直向 m.buffer 里追加长度为 1 MiB 的数组,直到总容量到达 1 GiB 为止,且一直不释放这些内存,这就难怪会有这么高的内存占用了。使用 web
来查看图形化展示,可以再次确认问题确实出在这里: