美文网首页
内存泄露

内存泄露

作者: 会理发的店小二 | 来源:发表于2020-07-15 23:41 被阅读0次

内存泄露

实战

实战Go内存泄露 - Go语言实战 - SegmentFault 思否

总结

pprof工具

  • 使用方式
go tool pprof url

#下载cpu profile,默认从当前开始收集30s的cpu使用情况,需要等待30s
go tool pprof http://localhost:6060/debug/pprof/profile   # 30-second CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=120     # wait 120s

# 下载heap profile
go tool pprof http://localhost:6060/debug/pprof/heap      # heap profile

# 下载goroutine profile
go tool pprof http://localhost:6060/debug/pprof/goroutine # goroutine profile

# 下载block profile
go tool pprof http://localhost:6060/debug/pprof/block     # goroutine blocking profile

# 下载mutex profile
go tool pprof http://localhost:6060/debug/pprof/mutex
  • 三段式
top:显示正运行到某个函数goroutine的数量
traces:显示所有goroutine的调用栈
list:列出代码详细的信息。

goroutine泄露的本质

goroutine泄露的本质是channel阻塞,无法继续向下执行,导致此goroutine关联的内存都无法释放,进一步造成内存泄露

goroutine泄露的发现和定位

利用好go pprof获取goroutine profile文件,然后利用3个命令top、traces、list定位内存泄露的原因。

goroutine泄露的场景

泄露的场景不仅限于以下两类,但因channel相关的泄露是最多的。

  • channel的读或者写:

    • 无缓冲channel的阻塞通常是写操作因为没有读而阻塞
    • 有缓冲的channel因为缓冲区满了,写操作阻塞
    • 期待从channel读数据,结果没有goroutine写
  • select操作,select里也是channel操作,如果所有case上的操作阻塞,goroutine也无法继续执行

编码goroutine泄露的建议

为避免goroutine泄露造成内存泄露,启动goroutine前要思考清楚:

  • goroutine如何退出?
  • 是否会有阻塞造成无法退出?如果有,那么这个路径是否会创建大量的goroutine?

相关文章

网友评论

      本文标题:内存泄露

      本文链接:https://www.haomeiwen.com/subject/bjishktx.html