-、情景复现
这里举一个栗子,最简单的 java.lang.OutOfMemoryError: Java heap space错误的分析思路。
简单代码:
public static void main(String[] args) { List<String> list = new ArrayList<String>(); while(true){ list.add(new String()); System.out.println(1); } }
抛出异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:261) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at java.util.ArrayList.add(ArrayList.java:458) at com.compare_1.Main.main(Main.java:13)
//熟悉的配方 熟悉的味道
一般在简单的程序中,我们浏览代码能迅速的定位到问题所在。然后就可以从硬件或者代码优化来解决这个问题,但是在实际操作过程中,有出现比较复杂的情况,就需要使用一些工具来辅助程序猿来找到出现问题的代码。
二、内存快照
-XX:+HeapDumpOnOutOfMemoryError
配置VM arguments,加入上面的这条设置,在内存报错时则可以生成快照。快照存储在当前项目所在的workspace中
三、Memory Analyzer 快照分析工具
下载:http://www.eclipse.org/mat/downloads.php
1)选择适合的版本然后打开(不多说)。
2)选择快照,打开-工具左上角-File-Open Head Dump。
3)分析
3.1overview 全局分析内存使用情况
深颜色表示出错内存所占总分配内存的总数,这里-Xms20m -Xmx20m。
3.2 Open Dominator Tree
这里加载堆内存的所有信息,百分比让问题显而易见。
这里 Shallow Heap 单个对象所占大小。
Retained Heap 所有对象及引用所占大小。(垃圾回收)
3.3定位出错所在
总结
目前刚接触这个分析工具,这里简单描述下思路,未来会持续更新。
-- over--