Perftools拾遗

                                                                  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库存在问题的可能性非常大。

猜你喜欢

转载自lncyhhq.iteye.com/blog/2388394