简介
下面通过一个简单的例子来介绍一下mat的使用:
import java.util.LinkedList;
/**
* -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump
*
*/
public class HeapDump {
public static void main(String[] args) {
LinkedList<HeapDump> list = new LinkedList<HeapDump>();
while(true){
list.add(new HeapDump());
}
}
}
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to E:\Java\dump\java_pid2536.hprof ...
Heap dump file created [37651239 bytes in 0.219 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at cn.freemethod.inspect.HeapDump.main(HeapDump.java:14)
除了通过-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump虚拟机参数还可以通过jmap命令来获取堆信息。 jmap -dump:live,format=b,file=E:/java/dump/heap.bin pid jmap -dump:file=E:/java/dump/heap.hprof pid
jmap命令非常有用,在线上环境是不允许使用jvisualvm这样对性能影响较大的工具的时候,并且有时候会有一些情况下不允许立即内存溢出,就可以通过jmap命令来获取堆,jmap命令也会比其他三方工具占用更少的资源。
MAT
如上图中蓝1所示,在概览中主要是展示了对的大小,Class的多少,对象的多少,类加载器的多少。 如上图中蓝2中涉及2个概念Shallow Size和Retained Size: Shallow Size是指对象自身占用的内存大小,不包括它引用的对象。针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。针对数组类型的对象,它的大小是数组元素对象的大小总和。 Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和 上图中蓝3是对象多少的柱状图和主要对象的链接,蓝4是可能存在泄漏的分析链接。
上图柱状图所表示的是对象的多少和占用的大小的排序。
上图是柱状图的的对象列表涉及到下面2个概念:
with outgoing reference:持有的外部对象引用
with incoming reference:被外部对象引用
如上图是是对类的查看,主要涉及下面2个概念:
by outgoing reference:持有的外部类引用
by incoming reference:被外部类引用
上图是内存泄露可能存在的点分析定位
上图是mat中的系统信息概览,主要帮助问题定位和重现
上图是线程的概览,帮助定位分析问题出现在哪一个线程之中。
上图是jmap的heap参数命令,可以查看到一下堆相关的vm参数和实时的堆的一些变化。