????????????????????????????????????????????????????????????????? Perftools拾遗
?????? 做为一个java程序员,堆外内存泄漏问题并不总能遇到。去年年底换公司去了一个游戏小公司。去之前就一直听说存在内存泄漏问题,但是一直不知道问题出现在哪里。由于权限,职责的原因,没能直接参与线上的问题排查。今年六月份,我负责服务器迁移,调整,使得我不得不直接参与线上问题的排查。
?????? 问题描述:在一个8核16G的常规服务器配置上,项目每隔几天就会宕机一次。在观察的过程中,我发现。java堆外内存大约以每6小时100M的速度在增长。高峰时段可能速度还会稍微快一些。这是一个棘手的问题。因为我对堆外内存并不熟悉。我们使用了netty框架,我最开始以为可能是io的问题。经查正发现我们的项目并没有使用堆外内存来提升性能。我们自己包装了jni库,会不会是jni库出了问题呢?为了验证这种猜测,我使用了Google的Perftools工具来做数据样本分析。以下为整个测试过程。
????? 1,软件安装
????? 下载google-perftools-master.zip ,libunwind-0.99-beta.tar.gz
????? a.unzip google-perftools-master.zip
????? b.tar -zxvf libunwind-0.99-beta.tar.gz
????? c.安装libunwind
?????????? ① cd libunwind-0.99-beta
?????????? ② ./configure
?????????? ③ make
?????????? ④ make install
???? d.安装 google-perftools-master
?????????? ① cd google-perftools-master
?????????? ② ./configure
?????????? ③ make
?????????? ④ make install
???? e.配置libunwind
??????? vim /etc/ld.so.conf 添加 /usr/local/lib 保存
???? f.启动 /sbin/ldconfig
???? 2,在项目启动脚本中引入
???? export LD_PRELOAD=/usr/local/lib/libprofiler.so:/usr/local/lib/libtcmalloc.so
???? export HEAPPROFILE=/data/pef/pef.out
???? HEAPPROFILE为配置输出文件的位置。
???? 3,启动脚本,观察结果,可以看到诸如下面的文件列表
使用pprof 命令分析以上文件结果。
按创建对象数量查看
pprof --cum --text --alloc_objects $JAVA_HOME/bin/java pef.out_15468.0181.heap >1.txt
按分配的内存多少查看
pprof --cum --text --alloc_space $JAVA_HOME/bin/java pef.out_15468.0181.heap >2.txt
综合以上分析,可以看出我们自己包装的NavLib库存在问题的可能性非常大。