JVM系列:Dump文件的生成和分析

概括

Dump包分析是JVM问题排查的杀手锏啦,直接定位到大对象所在的类,为问题排查提供最直接的指导

Dump文件的生成

  1. jmap命令生成: jmap -dump:live,file=dump_001.bin PID
  2. 监控工具生成:jvisualvm 工具里面有 Heap Dump的功能
  3. jvm参数的配置: 比如FullGC的时候生成dump包
  • HeapDumpBeforeFullGC :实现在Full GC前dump。
  • HeapDumpAfterFullGC :实现在Full GC后dump。
  • HeapDumpPath :设置Dump保存的路径
Java ... -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=e:\dump testgc.Main

Dump文件的jvisualvm分析

测试代码:制造一个大的HashMap对象

public class TestMain {
     //声明缓存对象
    private static final Map map = new HashMap();
    public static void main(String args[]){
        try {
            Thread.sleep(10000);//给打开visualvm时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //循环添加对象到缓存
        for(int i=0; i<4000000;i++){
            TestMemory t = new TestMemory();
            map.put("key"+i,t);
        }
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("qqqq");
    }

}
class TestMemory{
    public  String name="huangzs";
    public  String address="huangzs_jiujiangshi_jiangxisheng";
}

先把Dump文件导入到jvisualvm中

  1. 根据size进行排序,查看大的对象
  2. 根据size/百分比得到当前 堆区的大小
  3. 当前最大的对象:multiThread.TestMain ,也就是 multiThread包下的TestMain这个类,占了19%堆的大小
  4. 堆中对象占用空间最大的对象类型是 java.util.HashMap$Entry,也就是HashMap有很多的Entry
  5. 最大的java.util.HashMap编号是 174


    13381980-d8d14eab911e24d7.png
    image

大对象分析

  1. 对象编号174 ,占用空间 67108888b % (1024*1024)=64M
  2. 这个对象是被 TestMain这个类的 map这个属性引用的
  3. 另外左边的小框框的右上角 提供按照 size排序的功能


    13381980-5c6f2c39bdc4b592.png
    image

喜欢要点赞!

猜你喜欢

转载自blog.csdn.net/weixin_33711647/article/details/87513133