1、OOM测试及MAT分析
今天做个小实验:模拟OOM内存溢出,并做简单分析。
使用代码:
/**
* 设置VM的堆最大-Xmx2m、堆最小-Xms2m、年轻代-Xmn256k
* 并且当OOM时将dump输出到HeapDumpPath指定的目录 * -Xmx2m -Xms2m -Xmn256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/hello/Downloads/oom/
*/ public class OOMTest { public static void main(String[] args) { StringBuffer s = new StringBuffer(); for (int i=0;i<10000000;i++){ if(i%10000==0) { System.out.println("i:" + s.length()); } s.append("a"); } } }
执行结果如下,同时生成了dump文件:
i:140000 java.lang.OutOfMemoryError: Java heap space Dumping heap to /Users/hello/Downloads/oom/java_pid6069.hprof ... Heap dump file created [1319263 bytes in 0.010 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) at java.lang.StringBuffer.append(StringBuffer.java:270) at cn.vertxonline.test.string.StringMaxLength.main(StringMaxLength.java:15)
使用MAT进行分析:File->Open Heap Dump..
默认显示Overview页面。查看Biggest Objects by Retained Size(查看对象本身及它持有的对象占用空间最大的几个对象)
点击占比最大的区域:List Objects --> with outgoing references(查看该对象引用了哪些对象)/with incoming references(查看哪些对象应用了该对象。)
可以看到哪个对象占比最大,以及它对应的值是什么
共拼接了147454个字节。
仍有几个疑惑:
- 为什么Shallow Heap显示的294928?
- GC Roots是什么?
- 虚/弱/软引用分别是什么意思。