菜鸟笔记
提升您的技术认知

heapprofile对程序做内存分析

(1)下载gperftools

(2)编译的时候最后链接libtcmalloc.a ../../../gperftools-master/libtcmalloc.a

(3)启动的时候设置环境变量 nohup env HEAPPROFILE=/tmp/ ./server & (HEAPPROFILE+.xxx.heap -> .heap文件的位置)

(4)在启动完,打算开始检测的时候调用 (以下两个函数所在的头文件 gperftools-master/src/gperftools/heap-profiler.h)

HeapProfileStart(const char *p_name)
功能:给定一个路径,设置生成的xxx.001.heap文件(xxx为生成.heap文件的前缀,即p_name)
也可以为空,然后在运行程序时 设置生成文件的前缀
//(3)中的设置优先级更高 env HEAPPROFILE=/tmp/xxx(设置.heap文件的位置,两种方法都可以。如果既在函数中设置也在环境变量中设置,则以环境变量的设置为准)

HeapProfileStop()

(5)之后进程会在每次申请内存超过1G或者减少内存超过1G的时候打印堆的信息(Linux包括虚拟内存的变化)

(6)进程运行过程会在/tmp/目录下生成一系列的以 .heap结束的堆文件,分析文件,需要用gperftools目录下自带的pprof工具,命令行如下:
pprof --dot …/server /tmp/profile.0001.heap > tmp.dot

(7)会生成.dot文件,之后再调用dot(dot是系统的图像处理包,可以用apt-get install graphviz来安装)
dot -Tpdf tmp.dot -o tmp.pdf会生成一个pdf文件,文件内是调用图,打印出这段时间内申请内存最高的函数

(8)如果想要对比一段时间段内,比如16:00 - 20:00,内存增长了4G,想看看这4G是怎么来的,那就根据时间段,看看16:00附近的.heap跟20:00附近的.heap,假设是 .0040.heap 和 .0083.heap
调用命令行(指定–base是指定比较的开始时间点,也就是基准)
pprof --dot …/server --base=/home/leagsoft/project/works/heap/.0040.heap /home/leagsoft/project/works/heap/.0083.heap > tmp.dot
之后同样方式生成pdf,
dot -Tpdf tmp.dot -o tmp.pdf,打印出这段时间内增长的4G是怎么来的

生成的pdf文件