dump文件是java虚拟机内存在某一时间点的快照文件,通常是.hprof文件,下面本身模拟一下本地内存溢出,生成dump文件,而后经过mat工具分析的过程。html
要想本地模拟oom异常,那么建议将堆内存设置的小一点,那样容易触发java
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} -Xms20m -Xmx20m
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对象,却又没法释放,很快就内存溢出了。jvm
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工具
预览界面,能清楚的看到整个堆总内存18.7M,可是有18.3M的内存被一个类的对象占用了线程
Histogram柱状图:以class类的维度展现每一个class类的实例存在的个数、 占用的 [Shallow内存] 和 [Retained内存] 大小,能够分别排序显示,从图中看到,Person类的实例占用内存最大,而它就是没有回收引发内存溢出的对象3d
Dominator Tree支配树:该视图以实例对象的维度展现当前堆内存中Retained Heap占用最大的对象,以及依赖这些对象存活的对象的树状结构code
展开会展现下一层子节点,能够这么理解:父节点引用了子节点,子节点没有被回收,因此父节点也无法被回收htm
Thread Overview::能够看到线程栈/线程对象信息对象
把线程进行一个排序,一样能看到引发内存溢出的是最上面线程里面的Person对象blog
能够选择展现什么样的报告信息,咱们最开始打开dump文件时,会弹出一个窗口让咱们选择,若是选错了这里能够从新选择
这里的功能比较强大,主要用来分析GC引用关系,每一个对象到GCRoot的引用,能够在柱状图或者支配树界面里选择可疑对象进行分析,比较经常使用的两个是:Path to GC ROOTS和Merge Shortest Paths to GC Roots,固然选中对象双击,也能进入到这样的界面
Group分组功能:在 Histogram视图 和 Domiantor Tree视图时可操做,即以什么样的维度展现
将分析报告以什么样的格式导出,可选的有html、csv、txt。便于在团队合做分析dump文件时,无需将庞大的dump文件拷贝过去,只须要生成以上格式的文件,就能很方便的转移。
以上用做笔记,方便下次本人查阅为主。