package ch02;
import java.awt.List;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
/*
* VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
*
*
*
* */
public class HeapOOM {
static class OOMObject{};
public static void main(String[] args) {
ArrayList<OOMObject> list=new ArrayList<OOMObject>();
while(true){
list.add(new OOMObject());
}
}
}
控制台打印
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid5976.hprof ...
Exception in thread "main" Heap dump file created [33357309 bytes in 0.436 secs]
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at ch02.HeapOOM.main(HeapOOM.java:18)
Memory Analyzer安装
可以在http://www.eclipse.org/mat/downloads.php选择合适的方式安装。安装完成后切换到Memory Analyzer视图。
也可以离线下载安装到C:\Program Files\eclipse\dropins
file-》open打开项目下的堆粗快照
Overview
Problem Suspect 1
Problem Suspect 1
The thread java.lang.Thread @ 0x264f0c40 main keeps local variables with total size 18,095,928 (99.40%) bytes.
The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".
Keywords
java.lang.Object[]
Details »
MAT工具分析了heap dump该图深色区域被怀疑有内存泄漏,可以发现整个heap才17.4M内存,深色区域就占了绝大部分。接下来是一个简短的描述,
告诉我们main线程占用了大量内存,并且明确指出system class loader加载的"java.lang.Thread"实例有内存聚集,并建议用关键字
"java.lang.Thread"进行检查。所以,MAT通过简单的两句话就说明了问题所在,就算使用者没什么处理内存问题的经验。在下面还有一个"Details"链接,
在点开之前不妨考虑一个问题:为何对象实例会聚集在内存中,为何存活(而未被GC)?是的——Strong Ref,