如何通过MAT分析内存溢出的问题
1.首先模拟一个内存溢出的错误并修改项目配置,生成错误信息文件
可以自己写一个测试类main方法调用该方法
public void testMethod(){ List<Object> list=new ArrayList<>(); while (true){ int[] index=new int[20_0000_0000]; list.add(index); } }
2.修改idea项目运行配置
-Xms60m -Xmx60m:定运行内存大小
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\nuaa\Desktop\error:定发生内存溢出的时候生成错误文件
启动项目,触发写的方法,就会报OutOfMemoryError错误
此时,你指定的路径中就会生成一个错误dump文件
接下来就是用MAT工具分析错误
1.安装MAT
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse 的一部分,和现有的开发平台集成。
集成版的安装需要借助 Update Manager,个人感觉独立版的比较合适,因为有的时候没有Eclipse
下载地址:https://www.eclipse.org/mat/downloads.php
(看好版本,如果你jdk是1.8的,选择1.9.1版本的,我下载了一个1.13.0是需要jdk11的)
下载成功后,得到一个压缩文件,对其进行解压,得到一个mat文件
双击MemoryAnalyzer.exe 打开MAT分析工具
使用步骤:
1.使用 Memory Analyzer Tools 获取堆存储,点击Open Heap Dump,选择上面运行获取的错误信息文件(工具分析的时候会在dump文件所在的文件夹中生成其他文件,最好是将dump文件单独放到一个空文件夹中)
注意:如果dump过大打不开,因为服务器上一般出问题的dump都会好几个G,这是MAT的运行内存不足没办法分析过大的dump,所以就要修改MAT运行参数
具体看你分析的dump有多大,来修改运行内存,因为我分析的dump将近7个G,所以就设置了8000m
设置到内存以后,就可以继续打开dump进行分析了
- Histogram :可以列出内存中的对象,对象的个数以及大小。
- Dominator Tree:可以列出线程,以及线程下面的那些对象占用的空间。
- Top consumers:通过图形列出最大的object。
- Leak Suspects:通过MA自动分析泄漏的原因。
点击图中的按钮,可以看出大概是哪个请求出了问题