如何使用Jemalloc跟踪JVM堆外内存泄漏

编译和安装jemalloc

  • git checkout stable-4
  • ./autogen.sh
    报错

./autogen.sh: 5: ./autogen.sh: autoreconf: not found

上述报错,主要是因为如下工具没有安装, ubuntu 可以执行如下命令,就可以解决

apt-get install autoconf automake libtool
  • ./configure --enable-prof
  • make
  • sudo make install

cannot stat ‘doc/jemalloc.html’: No such file or directory

make install_bin install_include install_lib

查看so装到哪儿去了

find / -name *jemalloc.so

使用

启动jar之前设置下环境变量:
export LD_PRELOAD=/usr/local/lib/libjemalloc.so

export MALLOC_CONF=prof:true,lg_prof_interval:30,lg_prof_sample:17,prof_final:true,prof_prefix:/usr/dump/jeprof.out

环境变量LD_PRELOAD用来替换原生的glibc malloc。 然后启动jar,运行一段时间,停掉后会生成多个jeprof.{processId}的文件.

  • lsof -n |grep 87657|grep jemalloc 这个指令是查看进程是否挂载某个动态库

注意生成pdf时需要下面两个依赖
apt-get install graphviz
apt install ghostscript

jeprof --show_bytes --pdf /usr/local/openjdk-8/jre/bin/java ./jeprof*.heap > ./x.pdf

这个指令一定要带上java这个elf文件才行

最后有将近95%的内存来自于jvm本身,也由于运行时间不是很长,所以可以认为是安全的,如果再持续一段时间这个百分比降低了,说明有内存泄露的可能。
jeprof --show_bytes --pdf /usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java ./jeprof*.heap > ./x.pdf
export LD_LIBRARY_PATH=/home/zxf/openjdk7/build-debug/hotspot/outputdir/linux_i486_compiler1/jvmg/
export JAVA_HOME=/home/zxf/openjdk7/build-debug/j2sdk-image/
export CLASSPATH=.:/home/zxf/openjdk7/build-debug/j2sdk-image/lib:/home/zxf/openjdk7/build-debug/j2sdk-image/jre/lib
参考
https://www.cnblogs.com/ylz8401/p/15960640.html

posted @ 2023-12-12 11:17  方东信  阅读(180)  评论(0编辑  收藏  举报