使用MAT排查内存溢出

使用MAT排查内存溢出_第1张图片

本文主要目的是通过MAT工具来排查内存溢出问题。大致分为几个阶段:

1:java 代码demo

2:配置好相关参数

3:下载安装MAT

4:导入.hprof日志文件

5:分析并找出问题所在


java out of memory demo

package com.tian.netty.memory;
import java.util.ArrayList;
import java.util.List;
public class MemoryOutDemo {
private static List list=new ArrayList<>();
   public static void main(String[] args) {
while (true){
UserDomain userDomain=new UserDomain(1,"test");
         list.add(userDomain);
     }
}
}
package com.tian.netty.memory;
public class UserDomain {
private int id;
   private String name;
   public UserDomain(int id, String name) {
this.id = id;
       this.name = name;
   }
// get set 方法 省略
}

参数设置

导出内存映像文件的两种方法:

1:自动

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\gc.hprof 

2:手动:jmap

jmap -F -dump:live,file=jmap.hprof [PID] 导出内存dump文件


本次使用的是自动导出,参数具体设置为:

-Xmx20M -Xms20M 

-XX:+HeapDumpOnOutOfMemoryError 

-XX:HeapDumpPath=D:\gc.hprof 

-XX:+PrintGCDetails

运行代码

使用MAT排查内存溢出_第2张图片

内存映像文件已经导出到d盘了


下载安装MAT

下载地址

https://www.eclipse.org/mat/downloads.php

由于本人电脑是Windows10 64位的,所以下载的是

使用MAT排查内存溢出_第3张图片

下载好了直接解压,然后运行

使用MAT排查内存溢出_第4张图片

运行起来就是

使用MAT排查内存溢出_第5张图片

日志文件导入

File---Open Heap Dump 导入内存映射文件

使用MAT排查内存溢出_第6张图片

分析问题

MAT怀疑的对象是:

使用MAT排查内存溢出_第7张图片

看得出来MAT怀疑是正确的。

MAT常用的两个功能:

第一个:

使用MAT排查内存溢出_第8张图片

使用MAT排查内存溢出_第9张图片

也可以支持正则表达式查询

输入tian回车,就能查出tian相关的包路径的所有对象信息

使用MAT排查内存溢出_第10张图片

第二个:

使用MAT排查内存溢出_第11张图片

使用MAT排查内存溢出_第12张图片

使用MAT排查内存溢出_第13张图片

有此我们已经找到问题所在,就是MemoryOutDemo中的List中存在的对象太多而导致内存溢出的。

这里只是一个简单的使用MAT排查内存溢出的问题,如果在线上内存溢出就没这么简单了,但是方法类似,只是排查起来复杂。希望对你有帮助

你可能感兴趣的:(使用MAT排查内存溢出)