java程序OOM分析

本文详细介绍了如何在Java程序出现OutOfMemoryError时进行问题定位。通过模拟内存溢出,利用jvisualvm观察堆内存变化,dump堆数据并使用MAT工具分析,找到占用内存最多的对象。此外,还介绍了在生产环境中设置自动dump,并分享了实际案例和MemoryAnalyzer工具的使用,为Java OOM问题的解决提供了一套完整流程。
摘要由CSDN通过智能技术生成

本文主要介绍了 在java程序出现了OOM的时候,我们可以怎么办来追踪问题。

1.模拟一下内存溢出:

  • 使用main方法测试,写一个一直创建新对象的方法,往list中添加;

 

Integer size = 2048*10;
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
System.out.println(i);
TimeUnit.MILLISECONDS.sleep(10);
list.add(new byte[size]);
}
  • cmd打开jvisualvm,打开类,观察堆空间的曲线动态图;

  • dump堆 数据出来,生成一个heapdump-pid.phrof 的文件,使用jvisualvm打开观察数据,可以看到类数量统计,哪一个数据占用的空间最多,存在多少对象;

这里点击堆dump可以下载

观察到这里堆内存中数据量最大的数据

 

  • 生产环境自动dump出oom信息的phrof文件,使用启动参数 -XX:+HeapDumpOnOutOfMemoryError ,导出地址:-XX:+HeapDumpPath=

可以看到,在我们发生了oom后,jvm直接自动给我们dump了一个文件


java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid17372.hprof ...
Heap dump file created [63917844 bytes in 0.043 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.example.spring20200217test.SomethingTest.main(SomethingTest.java:68)
  • 使用mat(MemoryAnalyzer)工具进行分析,该工具基于eclipse,直接跟jvisualvm类似操作。

 

 

 

2.实际使用案例:https://blog.csdn.net/liu765023051/article/details/75127361

 

附录:更新链接文章:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值