本文主要目的是通过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<UserDomain> 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
运行代码
内存映像文件已经导出到d盘了
下载安装MAT
下载地址
https://www.eclipse.org/mat/downloads.php
由于本人电脑是Windows10 64位的,所以下载的是
下载好了直接解压,然后运行
运行起来就是
日志文件导入
File---Open Heap Dump 导入内存映射文件
分析问题
MAT怀疑的对象是:
看得出来MAT怀疑是正确的。
MAT常用的两个功能:
第一个:
也可以支持正则表达式查询
输入tian回车,就能查出tian相关的包路径的所有对象信息
第二个:
有此我们已经找到问题所在,就是MemoryOutDemo中的List中存在的对象太多而导致内存溢出的。
这里只是一个简单的使用MAT排查内存溢出的问题,如果在线上内存溢出就没这么简单了,但是方法类似,只是排查起来复杂。希望对你有帮助