查看堆内存占用正常,jvm垃圾回收也没有异常。而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏。
需要安装google-perftools工具进行分析
1.先安装g++
不然编译会报错:g++: command not found
# yum -y install gcc gcc-c++
----
2.安装libunwind
不建议版本>0.99据说有问题,这个需要FQ
# wgethttp://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz
# tar -xzvf libunwind-0.99.tar.gz
# cd libunwind-0.99
# ./configure --prefix=/data0/java/deploy/google-perftools/local/libunwind
# make && make install
---------
3.安装gperftools
# wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz
# tar -xzvf gperftools-2.5.tar.gz
# cd gperftools-2.5
# ./configure --prefix=/data0/java/deploy/google-perftools/local/gperftools-2.5/
# make && make install
-----------
4.使配置生效
# vim /etc/ld.so.conf.d/usr_local_lib.conf
新增以下内容按i
/data0/java/deploy/google-perftools/local/libunwind/lib
按esc再:wq! #保存退出
# /sbin/ldconfig #执行此命令,使libunwind生效。 需要sudo权限
-------------------
5.加入环境变量
# export LD_PRELOAD=/data0/java/deploy/google-perftools/local/gperftools-2.5/lib/libtcmalloc.so
# export HEAPPROFILE=/data0/java/deploy/google-perftools/local/tmp/gzip
------
6.运行java程序
# java -classpath /xxx.jar com.xxx.xxx.HttpMain
就会在/data0/java/deploy/google-perftools/local/目录下生成heap文件
如果是持续运行的程序需要ctrl+c会生成dump文件。
7.分析函数调用
# /data0/java/deploy/google-perftools/local/gperftools-2.5/bin/pprof --text /usr/lib/jdk/jdk1.8.0_161/bin/java /data0/java/deploy/google-perftools/local/tmp/gzip.0001.heap