zoukankan      html  css  js  c++  java
  • 本地模拟内存溢出并分析Dump文件

    java Dump文件分析

    前言

    dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程。

    配置虚拟机参数

    要想本地模拟oom异常,那么建议将堆内存设置的小一点,那样容易触发

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} -Xms20m -Xmx20m
    
    1. -XX:+HeapDumpOnOutOfMemoryError表示jvm发生oom异常时,自动生成dump文件,文件格式一般是:java_pid20804.hprof ,其中20804是java进程id
    2. -XX:HeapDumpPath=${目录},表示生成dump文件的目录,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof,此步骤实验出了点问题,暂时跳过
    3. -Xms:表示给jvm分配的初始化堆内存
    4. -Xmx:表示最大堆内存

    模拟oom异常的程序

    public class Test1 {
        public static void main(String[] args) {
            List<Person> personList = new ArrayList<>();
            while (true){
                Person person = new Person();
                person.setDate(new Date());
                person.setAge(20);
                person.setName("test");
                personList.add(person);
            }
        }
    }
    

    很明显,一直创建Person对象,却又无法释放,很快就内存溢出了。

    java.lang.OutOfMemoryError: GC overhead limit exceeded
    Dumping heap to java_pid21892.hprof ...
    Heap dump file created [33907612 bytes in 0.152 secs]
    Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    	at Test1.main(Test1.java:15)
    

    生成的文件名称是java_pid21892.hprof,在项目的根目录下面,文件大小33.9M

    MAT工具分析dump文件

    预览

    预览界面,能清楚的看到整个堆总内存18.7M,但是有18.3M的内存被一个类的对象占用了

    功能介绍

    1. Histogram柱状图:以class类的维度展示每个class类的实例存在的个数、 占用的 [Shallow内存] 和 [Retained内存] 大小,可以分别排序显示,从图中看到,Person类的实例占用内存最大,而它就是没有回收引起内存溢出的对象

    2. Dominator Tree支配树:该视图以实例对象的维度展示当前堆内存中Retained Heap占用最大的对象,以及依赖这些对象存活的对象的树状结构

      展开会展示下一层子节点,可以这么理解:父节点引用了子节点,子节点没有被回收,所以父节点也没法被回收

    3. Thread Overview::可以看到线程栈/线程对象信息

      把线程进行一个排序,同样能看到引起内存溢出的是最上面线程里面的Person对象

    4. 可以选择展示什么样的报告信息,我们最开始打开dump文件时,会弹出一个窗口让我们选择,如果选错了这里可以重新选择

    5. 这里的功能比较强大,主要用来分析GC引用关系,每个对象到GCRoot的引用,可以在柱状图或者支配树界面里选择可疑对象进行分析,比较常用的两个是:Path to GC ROOTS和Merge Shortest Paths to GC Roots,当然选中对象双击,也能进入到这样的界面

    6. Group分组功能:在 Histogram视图 和 Domiantor Tree视图时可操作,即以什么样的维度展示

    7. 将分析报告以什么样的格式导出,可选的有html、csv、txt。便于在团队合作分析dump文件时,无需将庞大的dump文件拷贝过去,只需要生成以上格式的文件,就能很方便的转移。

    总结

    以上用作笔记,方便下次本人查阅为主。

  • 相关阅读:
    android开发过程遇到的一些错误
    TCP/IP协议详解笔记——ARP协议和RARP协议
    TCP/IP协议详解笔记——IP协议
    C# Exchange发送邮件
    Echarts柱状图堆叠显示总数
    Git解决fatal: unable to connect to github.com问题
    IIS 413错误 解决方案
    C#启动外部Exe控制台程序并输入命令
    再看JavaScript
    Web Api(5)
  • 原文地址:https://www.cnblogs.com/xiaoming0601/p/12268753.html
Copyright © 2011-2022 走看看