java模拟内存溢出并分析_模拟内存溢出&通过MAT分析

本文介绍如何创建一个简单的Springboot应用来模拟内存溢出,并使用Memory Analyzer (MAT)工具进行分析。通过在Controller层不断添加对象导致OOM,然后设置IDEA的VM选项生成dump文件。在MAT中解析dump文件,通过Dominator Tree和Leak Suspects来定位内存泄露源,从而找出问题代码。
摘要由CSDN通过智能技术生成

构建一个简单的Springboot应用,模拟出OOM场景,再导出heap dump文件,通过Mat分析。

搭建简易Springboot,模拟OOM场景

搭建一个简易的springboot工程,在controller层循环添加对象,直至OOM。

//循环添加对象,模拟OOM

List userVoListNew = new ArrayList<>();

for (int i = 0; i < 1024 * 1024 * 1024; i++) {

userVoListNew.addAll(userVoList);

}

复制代码

具体代码地址,只要本地启动mysql、redis就跑起来了(一般半支烟直接docker启动,方便快捷):gitee.com/yclxiao/blo…

设置idea & 导出dump文件

1、配置idea的 VM options

在VM options中设置最大内存,以及设置dump文件位置

-Xmx512m

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/Users/yclxiao/Desktop/java_error_in_idea.hprof

复制代码

811045a8f24a232550ba0bcde70773eb.png

2、启动项目

启动项目,swagger调用userController方法,等待OOM出现。最后会在配置的位置上出现java_error_in_idea.hprof文件。

Mat分析dump文件

安装Memory Analyzer

下载地址:www.eclipse.org/mat/downloa…

导入dump文件

导入dump文件时,可能碰到以下错误:

An internal error occurred during: "Parsing heap dump from '/Users/yclxiao/Desktop/heapdump-1586847376115.hprof'".

Java heap space

复制代码

8b76897f231dd03dfcb3fe7c9b81d304.png

解决方式:修改Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini中的最大内存配置

a54b19fe16a9c98797834ab271b2de00.png

注意:半支烟是mac平台,window平台的文件位置稍微区别,小伙伴们自行查找下,哈哈!

分析dump文件

1、Mat分析概况

导出的dump文件大概400多M,通过MAT分析后,会看到一个饼状图,显示了排名靠前的大对象

69a46556d8f539af8a54c5d60bcd0e29.png

2、点击Dominator Tree & Leak Suspects

点击Dominator Tree可以列出最大对象的排名,以及他们持有了哪些对象。点击Leak Suspects可以看到比较有嫌疑的泄露以及系统概述。

f4ccbb05a223ffb66e2555b8c8587e7c.png

3、点击Dominator Tree

可看到最大的Object[],左边显示了他持有的对象,根据这个UserVo我们大概能排查到具体的代码位置。

43cd9ce819af0f940d9df7e006c59e0b.png

4、点击Leak Suspects

能大概看到是哪个线程的请求、看到是哪个大对象、看到是哪个具体业务代码,也有堆栈信息,一般根据这些信息能很快定位到有问题的业务代码。

bc2d3aa0759bac47d70ddf71a9fe2876.png

总结

​本文介绍了常见的分析OOM的方法。如果碰到线上问题先稳住不要慌,,第一时间保留线程(设置好OOM的dump位置),然后重启服务,再用Mat工具分析问题。

​当然啦,问题也可能出现在别的地方,半支烟碰到问题一般是top、df、free这3个命令跑一遍,先看下机器的CPU、硬盘、内存等情况,再做后续分析。

​如果更多好建议,欢迎与我交流。

原文链接

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[模拟内存溢出&通过MAT分析]http://www.zyiz.net/tech/detail-126873.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值