JVM(4)之 使用MAT排查堆溢出

本文通过一个具体的Java代码示例,演示了如何通过调整JVM参数触发堆溢出错误并利用MAT工具进行堆内存快照分析,最终定位到导致内存溢出的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码: 
这里写图片描述 
  代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: 
  -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError,elipse中的设置方法我们在第一章讲过了,这里不多说啦。-Xms10m,意思就是堆的最小内存为10m。同理-Xmx10m的意思就是最大内存也为10m。这两个都是设置为10m,那么堆的大小就是10m。而-XX:+HeapDumpOnOutOfMemoryError指的是当发生内存溢出的时候会将当前的内存使用情况生成一个快照保存起来,但需要eclipse下载一个MAT的插件,下载方式度娘到处都是。 
  使用刚刚设置的参数启动程序,稍等一小会就会出现以下错误: 
这里写图片描述 
  显示出堆溢出错误,并且生成了一个叫做java_pid4792.hprof的文件,我们刷新项目便可以看到该文件,双击打开,需要一段的加载时间。 
这里写图片描述 
  首先可以看到的是一个饼状图,占用部分最大的便是发生溢出错误的部分,我们接着往下看 : 
这里写图片描述 
  我们这里看看画红线的部分,这里列出一些存活的大对象,在溢出的时候一般先怀疑大对象,我们点进去: 
这里写图片描述 
  这里列出占用内存最大的几个对象,很显然,第一个很可疑,占用率达到了94.64%!继续跟进: 
这里写图片描述 
  发现都是test对象,因此排查的时候可以从这个方面下手。接着我们右键该对象选择Path To GC Root(在引用链上的路径),再选择exclue all phantom/weak/soft etc. reference ,结果如图: 
这里写图片描述 
  可以看到他是被List引用了,因此一直在引用链上,导致无法被回收掉,也就出现了内存溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值