前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 排查内存占用过高问题

Go 排查内存占用过高问题

作者头像
王小明_HIT
发布2021-09-15 11:20:51
2.2K0
发布2021-09-15 11:20:51
举报
文章被收录于专栏:程序员奇点程序员奇点

下载测试代码

go get 中可以获取测试程序, 注意加上 -d 避免下载后自动安装。

Github

代码语言:javascript
复制
go get -d github.com/wolfogre/go-pprof-practice
cd $GOPATH/src/github.com/wolfogre/go-pprof-practice

如果 go get 下载不了, 可以 git clone 下载

代码语言:javascript
复制
gir clone https://github.com/wolfogre/go-pprof-practice

对代码进行编译

然后运行

代码语言:javascript
复制
go mod init
go mod tidy

最后再运行

代码语言:javascript
复制
go build
./go-pprof-practice

运行 pprof 命令

代码语言:javascript
复制
go tool pprof http://localhost:6060/debug/pprof/heap

在这里插入图片描述

还是三板斧top, list 等命令

list 命令

可以看到这次出问题的地方在 github.com/wolfogre/go-pprof-practice/animal/muridae/mouse.(*Mouse).Steal,函数内容如下:

代码语言:javascript
复制
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 来查看图形化展示,可以再次确认问题确实出在这里:

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

公众号:程序员财富自由之路

博客:CSDN 王小明

关注我们,了解更多

关注后:回复 “idea” 或者 “内推”, 有惊喜

参考资料
  • https://blog.wolfogre.com/posts/go-ppof-practice/#%E6%8E%92%E6%9F%A5-cpu-%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载测试代码
    • 欢迎关注公众号:程序员财富自由之路
      • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档