Goole perftools工具使用
安装
1. yum 安装
yum install gperftools
2. 源码安装
源码路径:
https://code.google.com/p/google-perftools/
执行命令
./configure
make
make install
Heapprofile使用介绍
首先需要把tcmalloc链接到我们需要分析的程序中, 当然我们也可以动态load 这个lib,但是为了简单起见,还是推荐大家链接这个lib到自己的程序中。
链接之后,我们接下来的任务就是得到内存分析的dump文件,我们有两种方法:
1. 静态dump方法:
直接定义一个环境变量HEAPPROFILE来指定dumpprofile文件的位置,如:/tmp/test.log,它将会在/tmp/目录下生成很多类似/tmp/test.log.0003.heap文件名的文件
env HEAPPROFILE="/tmp/test.log" /test/testprog
2. 动态dump方法:
我们可以调用Google Heap Profiler的API来控制什么时候dump出内存的profiler文件,这样更加灵活,为此,我们必须包含heap-profiler.h这个头文件。
HeapProfilerStart() 用来开始内存分析
HeapProfilerStop(). 用来终止内存分析
这样就只会在开始和结束之间产生dump profiler文件。
用法
首先需要把tcmalloc链接到我们需要分析的程序中, 当然我们也可以动态load 这个lib,但是为了简单起见,还是推荐大家链接这个lib到自己的程序中。
链接之后,我们接下来的任务就是得到内存分析的dump文件,我们有两种方法:
1. 静态dump方法:
直接定义一个环境变量HEAPPROFILE来指定dumpprofile文件的位置,如:/tmp/test.log,它将会在/tmp/目录下生成很多类似/tmp/test.log.0003.heap文件名的文件
env HEAPPROFILE="/tmp/test.log" /test/testprog
2. 动态dump方法:
我们可以调用Google Heap Profiler的API来控制什么时候dump出内存的profiler文件,这样更加灵活,为此,我们必须包含heap-profiler.h这个头文件。
HeapProfilerStart() 用来开始内存分析
HeapProfilerStop(). 用来终止内存分析
这样就只会在开始和结束之间产生dump profiler文件。
选项
- HEAP_PROFILE_ALLOCATION_INTERVAL
程序内存每增长这一数值之后就dump 一次内存,默认是1G (1073741824)
- HEAP_PROFILE_INUSE_INTERVAL
程序如果一次性分配内存超过这个数值dump 默认是100K
在执行完
env HEAPPROFILE="/tmp/test.log" /test/testprog
预期在/tmp/目录下将产生形如/tmp/test.log.xxxx.heap对应的文件,xxxx将从0000开始不断增长,
如果未能产生文件,有可能是,程序本身并未产生过大的内存,此时文件不一定能产生。所以可以通过配置HEAP_PROFILE_ALLOCATION_INTERVAL,或HEAP_PROFILE_ALLOCATION_INTERVAL的方式来产生heap文件
env HEAPPROFILE="/tmp/test.log" HEAP_PROFILE_ALLOCATION_INTERVAL=100000 \
HEAP_PROFILE_INUSE_INTERVAL=10000 /test/testprog
如果还未产生即可将这两个参数再设置成更小的值。
内存分析
对于已经产生的/tmp/test.log.xxxx.heap文件,可以通过pprof工具进行查看。
pprof可产生不同类型的结果,常用的选项可使用—text,及—pdf
pprof —text /test/testprog /tmp/test.log.0000.heap
这个命令将输出形如
501 62.2% 62.2% 714 88.6% RBTree::insert
84 10.4% 72.6% 84 10.4% RBTree::defaultCmp
80 9.9% 82.5% 154 19.1% RBTree::nodeCmp
61 7.6% 90.1% 73 9.1% RBTree::insertFixup
对于该输出的,对于每一行的内容说明如下:
序号 | 说明 |
1 | 函数占用内存数(不包含其他函数调用) |
2 | 函数内存占用百分比(不包含其他函数调用) |
3 | 目前为止的百分比(百分比累计值) |
4 | 函数占用总的内存数(包含其他函数调用) |
5 | 函数内存占用百分比(包含其他函数调用) |
6 | 函数名 |
pprof —text /test/testprog —base /tmp/test.log.0000.heap /tmp/test.log.0001.heap
该方法的输出内容格式是一样的,但是输出的结果是两个snapshot间的差异。
pprof —pdf /test/testprog /tmp/test.log.0000.heap
可以输出pdf文件,将可以看到更详细的函数调用关系。
Heap Checker
堆内存泄漏检测工具。使用简单,先在链接被检查程序的时候用-ltcmalloc选项连接Goolge Perftools的堆内存管理库tcmalloc(tcmalloc会替代C的堆内存管理库),然后每次用命令行“env HEAPCHECK=normal 可执行程序路径”来进行检查