写一段代码
堆内存溢出, 首先我们需要一段能够使堆内存溢出的代码.
import java.util.ArrayList;
/**
* @author imyzt
* @date 2019/5/7
* @description Main
*/
public class Main {
public static void main(String[] args) {
ArrayList<Demo> demos = new ArrayList<>();
while (true) {
demos.add(new Demo());
}
}
}
/**
* @author imyzt
* @date 2019/5/7
* @description Demo
*/
public class Demo {
}
通过制定堆内存大小, 指定堆内存快照, 可以快速获取一份堆内存溢出信息.可以通过在IDE的 VM options
设置.
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
这份文件在我们项目的根目录下面. 后缀名是 .hprof
. 我们可以通过eclipse提供的mat工具对堆内存快照进行分析. mat下载地址
接下来就是将我们的快照数据导入到工具中.
从图中我们可以看到 Problem Suspect 1(可能出现问题的区域)比较大, 总共20M的内存, 15M都有可能出现问题
从图中分析, 我们看到了95%的内存都被 main thread 占用, 然后点开树发现, 对象占用是最高的,几乎是主线程占用的内存的所有.