内存泄漏检查
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会生成多个报告文件,可以通过比较不同阶段的文件,快速找出在不断申请内存并不释放的函数。