监控工具 - java 内存调优
概述
java 内存调优 或内存监控, 推荐先看本系列的另外一篇介绍gc的文章, 在分析gc的过程中,串了很多工具来介绍如何做内存分析。
另外java 有一些调试工具不错, 可以推荐一下 jstack/jconsole
工具
- mat – 离线静态分析工具, 非常好用, 缺点是需要离线dump出来
- jmap – 常用内存dump 工具
1
2jmap -histo pid
jmap -dump:format=b,file=heap.bin <pid> - gpreftools – 类似perf 来查看内存
gpreftools
为了确认问题,在机器上安装了gpreftools工具进行调试
安装
安装过程比较麻烦,先下载最新的preftools包通过oss上传到机器上,重新编译make install;
需要安装机器上对应版本的gcc和g++:
sudo yum install gcc-4.1.2 gcc-c++-4.1.2 -b test;
函数调用栈输出库libunwind:
sudo yum install libunwind.x86_64 -b current;
在启停脚本参数配置setenv.sh中根据安装的路径加入export LD_PRELOAD=/home/xxx/perftools/lib/libtcmalloc.so以及export HEAPPROFILE=/tmp/test,
HEAPPROFILE的路径最好写在/tmp目录下,否则admin账号没权限写到个人目录里导致类似Failed dumping heap profile to /home/xxx/test.0001.heap的报错
安装好后重启应用通过/usr/sbin/lsof -n | grep tcmalloc来查看tcmalloc是否加载,且/tmp下是否有heap文件。
一段时间后当再次出现内存泄露的问题时,使用pprof –text /opt/taobao/java/bin/java test.xxxx.heap查看最新的heap文件。