package main
import (
"net/http"
_"net/http/pprof"
)
func init() {
go func() {
http.ListenAndServe(":8000",nil)
}()
}
首先使用通过pprof工具获取内存相差较大的两个时间点的数据,生成profile文件
curl localhost:8000/debug/pprof/heap > heap.base
等待一段时间,通过http可以查看内存文件又涨了许多,我们可以继续收集内存的情况
curl localhost:8000/debug/pprof/heap > heap.current
//然后通过go tool工具做比较,看看内存到底是在哪里泄漏了
go tool pprof -http=:8080 -base heap.base heap.current
// go tool会帮助我们生成svg文件,整个调用图都会画出来
进入UI界面后,选择当前分配的对象(insue_objects)
看看调用图,尝试找出内存泄漏的地方
pprof是什么?
Go 语言自带的 pprof 库就可以分析程序的运行情况,并且提供可视化的功能。它包含两个相关的库。通过线上流量回放,或者压测等手段,制造性能问题,再通过工具来分析系统的瓶颈:
- runtime/pprof,对于只跑一次的程序,例如每天只跑的离线预处理程序,调用pprof包提供的函数,手动开启性能数据采集
- net/http/pprof,对于一个http server,访问pprof提供的http接口,获取性能数据当然,实际上这里底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问