如何通过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自动分析泄漏的原因。

点击图中的按钮,可以看出大概是哪个请求出了问题

posted @ 2022-09-06 10:59  小小野生程序员sunny  阅读(998)  评论(0编辑  收藏  举报