内存泄漏检查

1.通过valgrind

1)编译最新的valgrind, 选择安装路径为/usr/

         ./configure --prefix=/usr/local/valgrind

         make

         make install

 2) 编译完后,将/usr/local/valgind压缩成软件包,然后拷贝到需要调测的设备对应的/usr/local目录下

 3) 调整服务启动脚本

a) 旧脚本如下:

$@ &

b) 修改为:

timestamp=`date +%F_%H%M.%S`

/usr/local/valgiind/bin/balgrind --tool=memcheck --leak-check=full –error-limit=no –log-file=/home/test_valgrind_${timestamp}.txt $@ &

4) 服务运行后正常关闭或者kill -11

5) 查看/home/test-vlgrind_${timestamp}.txt分析definitely lost的部分即可看出来哪写有内存泄漏。

 

2. 利用perftools,它的资源占有会小一些

1)  工具地址:http://code.google.com/p/gperftools/?redir=1

2)  下载后,需要自己进行编译,注意64位系统configure时,使用--enable-frame-pointers选项,并且不要再链接unwind库,否则有冲突

3)  编译完成后,会得到一个libtcmalloc.so动态库,和报告分析工具pprof(一个perl脚本,因此要确保机器上有perl解析器,一般suse机器都有,安全加固环境除外),将这两个文件到运行环境中,设置如下环境变量,重启程序。

export LD_PRELOAD=/home/uoa/gperftool/gperftools-2.0/.libs/libtcmalloc.so

//Linux预加载环境变量,使tcmalloc提供掉glibc的malloc

   export HEAPPROFILE=/home/heap/record  

//记录文件前缀,按照例子中设置,最终记录的文件是:/home/heap/record.xxxx.xxxx

export HEAP_PROFILE_INUSE_INTERVAL=1048570 

//新增有多少正在使用内存写一次文件(正在使用的内存是指未释放的内存,单位,字节,默认100M)

export HEAP_PROFILE_ALLOCATION_INTERVAL=1073700

//新增多少申请内存写一次文件(是指申请的总内存,包括已经释放的,单位,字节,默认1G)

4)  程序运行过程中,会向环境变量HEAPPROFILE为前缀的文件记录内存申请情况。

5)报告生成后,可以通过pprof来观察申请内存多的本地函数

pprof --text $JAVA_HOME/bin/java /home/sysomc/uniagent/bin/memory/data/<pid>/record_<pid>.xxx.heap > java_heapmalloc_trace

随着程序申请内存的增多,gperftool会生成多个报告文件,可以通过比较不同阶段的文件,快速找出在不断申请内存并不释放的函数。

 

posted on 2017-02-05 14:09  随性随行  阅读(657)  评论(0编辑  收藏  举报