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个字节。

仍有几个疑惑:

  1. 为什么Shallow Heap显示的294928?
  2. GC Roots是什么?
  3. 虚/弱/软引用分别是什么意思。

 

posted on 2020-05-09 01:49  每天进步一点点儿。  阅读(454)  评论(0编辑  收藏  举报

导航