深入理解java虚拟机-内存快照分析

时间:2023-01-02 13:56:08

-、情景复现

 这里举一个栗子,最简单的 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

深入理解java虚拟机-内存快照分析

配置VM arguments,加入上面的这条设置,在内存报错时则可以生成快照。快照存储在当前项目所在的workspace中

深入理解java虚拟机-内存快照分析

三、Memory Analyzer 快照分析工具

下载:http://www.eclipse.org/mat/downloads.php 

1)选择适合的版本然后打开(不多说)。

2)选择快照,打开-工具左上角-File-Open Head Dump。

3)分析

  3.1overview 全局分析内存使用情况

深入理解java虚拟机-内存快照分析

深颜色表示出错内存所占总分配内存的总数,这里-Xms20m  -Xmx20m。

  3.2 Open Dominator Tree

这里加载堆内存的所有信息,百分比让问题显而易见。

这里 Shallow Heap  单个对象所占大小。

Retained Heap  所有对象及引用所占大小。(垃圾回收)

深入理解java虚拟机-内存快照分析

  3.3定位出错所在

  深入理解java虚拟机-内存快照分析


总结

目前刚接触这个分析工具,这里简单描述下思路,未来会持续更新。

-- over--