OutOfMemoryError 分析

/ jvm / 0 条评论 / 245浏览

写一段代码

堆内存溢出, 首先我们需要一段能够使堆内存溢出的代码.

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 占用, 然后点开树发现, 对象占用是最高的,几乎是主线程占用的内存的所有.
内存分析