1. package main
  2. import (
  3. "net/http"
  4. _"net/http/pprof"
  5. )
  6. func init() {
  7. go func() {
  8. http.ListenAndServe(":8000",nil)
  9. }()
  10. }
  1. 首先使用通过pprof工具获取内存相差较大的两个时间点的数据,生成profile文件

    1. curl localhost:8000/debug/pprof/heap > heap.base
  2. 等待一段时间,通过http可以查看内存文件又涨了许多,我们可以继续收集内存的情况

    1. curl localhost:8000/debug/pprof/heap > heap.current
    2. //然后通过go tool工具做比较,看看内存到底是在哪里泄漏了
    3. go tool pprof -http=:8080 -base heap.base heap.current
    4. // go tool会帮助我们生成svg文件,整个调用图都会画出来

    进入UI界面后,选择当前分配的对象(insue_objects)
    image.png
    看看调用图,尝试找出内存泄漏的地方

pprof是什么?

Go 语言自带的 pprof 库就可以分析程序的运行情况,并且提供可视化的功能。它包含两个相关的库。通过线上流量回放,或者压测等手段,制造性能问题,再通过工具来分析系统的瓶颈:

  1. runtime/pprof,对于只跑一次的程序,例如每天只跑的离线预处理程序,调用pprof包提供的函数,手动开启性能数据采集
  2. net/http/pprof,对于一个http server,访问pprof提供的http接口,获取性能数据当然,实际上这里底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问

参考

golang-pprof-排查内存泄漏(一)
深度解密Go语言之 pprof
Gin框架中使用pprof