排查 Go 程序内存占用高问题

3,393 阅读1分钟

下载测试代码

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 下载

git 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 来查看图形化展示,可以再次确认问题确实出在这里: 在这里插入图片描述

欢迎关注公众号:程序员财富自由之路

参考资料