进入分析界面
 // 直接使用 http/pprof方式,也是最常用的方式
go tool pprof 
//也可以使用离线方式,效果时一样的
curl -s  > heap.prof
go tool pprof heap.prof  
常用的几种分析方法
  • 和分析CPU一样,topN,N可以随意选择

同样的内存topN和cpu topN类似:

flat : 代表当前函数(不包含当前函数的调用函数所占用的内存)所分配的内存值;

flat% : 代表当前函数所分配的内存值的总消耗内存的占比;

sum% : 代表当前topN函数分配的内存占比。例如第二行44.48%,是指第二行和第一行flat%之和,即top2的内存占比总和。

cum :代表当前函数以及其调用的函数所申请的总内存;

cum% : 代表当前函数以及其调用的函数所申请的总内存占进程总内存的比值。

  • 分析heap占用,和cpu类似,也有可视化的调用关系图

web、png、pdf等。如下生成。具体可在pprof 命令行中输入help产看。

和CPU分析相同;红框中表示每个函数或方法的内存占用,线条表明调用关系,线条上的数值代表被函数占用的内存总和。同样的inline调用也被标明了。方框或线条颜色越深,代表内存占用越高。

这里内存主要是堆内存,一般的栈内存是不会被统计到。不过出现内存逃逸就另说了。

分析内存泄漏

利用pprof可以较精准地分析出内存泄漏的位置。

 // 在业务运行环境中
curl -s  > heap1.prof
// 间隔 一段时间 (看具体情况,一般最难分析的是运行几个月不断缓慢增涨)
curl -s  > heap2.prof
//之后执行
go tool pprof -base heap1.prof heap2.prof  

可以使用top命令查看

可以看到在两次采集过程中,增量部分,从而能够直观地看出内存在哪些函数的分配速度最快。也可以通过web命令生成可视化页面:

可以看到在demo这个函数中,两次采集过程中增加58.9MB的内存,GC的速度没有分配的速度快,时间长之后内存很容易爆掉。

内存占用火焰图

使用火焰图之前需要安装依赖,具体见 中有详细介绍。下面直接介绍使用方式:

  • 生成火焰图
 go-torch -u  --suffix /debug/pprof/heap
// 注意这里如果是采集CPU的话,--suffix是不用指定的,默认就是/debug/pprof/profile  

go-torch会将火焰图默认存储在torch.svg文件中,存储文件也可以通过-p或-f(-f 的文件必须是.svg格式)指定指定。

下图中色块可以点击,能够显示内存占用情况,色块越长表明在采集时间内,内存消耗越多,是热点函数,性能优化是可以重点关注。

和CPU分析相同的,内存火焰图也可以离线生成

 // 首先通过pprof 工具产生cpu.prof文件
curl -s  > heap.prof
// 然后 利用go-torch工具生成或沿途
go-torch -b cpu.prof