Go 排查内存占用过高问题

简介: Go 排查内存占用过高问题

下载测试代码


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

image.png

还是三板斧top, list 等命令

image.png

list 命令

image.png


可以看到这次出问题的地方在 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 来查看图形化展示,可以再次确认问题确实出在这里:

image.png


相关文章
|
2月前
|
Java 数据库连接
Java中的内存泄漏排查与预防方法
Java中的内存泄漏排查与预防方法
|
2月前
|
存储 监控 算法
LeakCanary 的内存泄露问题排查
LeakCanary 的内存泄露问题排查
52 0
|
24天前
|
存储 安全 编译器
Go 内存分布
该文章深入分析了Go语言中值的内存分布方式,特别是那些分布在多个内存块上的类型,如切片、映射、通道、函数、接口和字符串,并讨论了这些类型的内部结构和赋值时的行为,同时指出了“引用类型”这一术语在Go中的使用可能会引起的误解。
45 5
Go 内存分布
|
1月前
|
JavaScript Java 开发工具
Electron V8排查问题之接近堆内存限制的处理如何解决
Electron V8排查问题之接近堆内存限制的处理如何解决
90 1
|
1月前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用
|
1月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
1月前
|
缓存 编解码 测试技术
使用Go实现健壮的内存型缓存
使用Go实现健壮的内存型缓存
52 2
|
2月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
|
2月前
|
监控 Java Linux
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
277 1
|
1月前
|
搜索推荐 Java API
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
38 0

热门文章

最新文章

相关实验场景

更多