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

-、情景复现

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值