记一次Jvm内存泄露问题排查

一.问题

生产环境服务器变慢

二.分析

从以下5个角度进行排查

   1.CPU ——  top命令

  2.内存 ——  free命令

  3.硬盘 ——  df命令

  4.磁盘Io ——  iostat命令

  5.网络Io —— ifstat命令

三.步骤

  1.Top命令进行整机查看

 从图中看出cpu基本正常,平均加载时间也正常,内存8.8g!!!

  2.初步定位内存太高,可能原因,内存溢出

  3.细看内存,执行命令free

   发现free内存很少

       4.查看gc回收器,执行命令 jmap -heap pid(进程号)

 

   fullgc不回收

  5.查看堆内存部分使用量 执行jstat -gcutil   pid 1000

   6.已初步确定内存溢出

    7.导出内存快照 jmap -dump:format=b,file=/tmp/heap.hprof  pid  

  8.下载到本地用MAT工具查看  

   懒汉式排查,直接查看Leak Suspects快速查看泄露的可疑点

   可以看出Hashmap中存在一个6g的数据一直占用内存,而且no GC root(可达性分析) 即不会被老年代的Full Gc回收。

  9.排查最近的代码,是否有新增Job或者Mq,里面是否有用到Hashmap

  10.最终发现有个job里面有用到Hashmap去获取一个非单例的对象。

  11.第二种工具jvisualvm

 将内存快照导入jvisualvm

 选择最高的大对象点击进去查看

四.总结

  针对不同的情况要从不同角度去分析

   先整体排查定位问题,针对不同问题排查不同地方

    一些常用排查命令请参考:https://www.cnblogs.com/shawn-sun/p/13970396.html

  

原文地址:https://www.cnblogs.com/shawn-sun/p/13967715.html