0%

概述

java 内存调优 或内存监控, 推荐先看本系列的另外一篇介绍gc的文章, 在分析gc的过程中,串了很多工具来介绍如何做内存分析。

另外java 有一些调试工具不错, 可以推荐一下 jstack/jconsole

工具

  • mat – 离线静态分析工具, 非常好用, 缺点是需要离线dump出来
  • jmap – 常用内存dump 工具
    1
    2
    jmap -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文件。

jvm gperf