本篇文章只讲述在遇到 OOM (java.lang.OutOfMemoryError:Java heap space) 这种情况如何利用工具分析问题,找到问题所在,关于JVM原理这方面的不过多深究。大家有兴趣的可以自行百度
本篇参考:狂神说 Java https://www.bilibili.com/video/BV1iJ411d7jS?p=9
文章目录
步骤一:准备一个简单的案例
首先,我们准备一个会触发 OOM 内存移除的小案例,代码如下:
package org.javaboy.test;
import java.util.ArrayList;
import java.util.List;
/**
* todo 要设置的 JVM 参数 -Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
* @Author: bai
* @DateTime: 2020/7/4 19:38
*/
public class TestDemo3 {
byte[] array = new byte[1 * 1024 * 1024];
public static void main(String[] args) {
List<TestDemo3> list = new ArrayList<TestDemo3>();
int count = 0;
try {
while (true) {
// 不停的 new 对象,大规律会触发 OOM 堆溢出问题
list.add(new TestDemo3());
count++;
}
} catch (Error e) {
System.out.println(count);
e.printStackTrace();
}
}
}
步骤二:下载 jprofiler 分析工具
官网地址:https://www.ej-technologies.com/download/jprofiler/files
下载步骤就不 BB 了,傻瓜式操作,相信听说过 JVM 的小伙伴(夸你们已经是一个合格的程序员了),百度下载软件对你们来说都是小意思。
第三步:IDEA 插件安装
本案例 Demo 是运行在 idea 上的,使用 jprofiler 分析工具前提,idea 也需要安装相应的插件,如下所示:
第二步设置 JProfiler 的位置,如下图所示:
第四步:运行代码(设置 JVM 运行参数)
运行本案例之前,需要设置一些 JVM 的参数,命令如下:
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
步骤五:JProfile 分析 Dump 文件
经过上面的 JVM 参数设置,然后生成如下文件,我们直接双击打开。
1. JProfiler(Biggest Objects 界面)
通过 Biggest Objects 界面,我们可以很直观的看到到底是因为什么产生的内存溢出,很明显,这么长长的一串红颜色,想不注意都难啊。
2. JProfiler(Thread Dump 界面)
通过这里可以直观的找到我们程序出错的位置,没错就是在 21 行。就是在这行,我们不停的在 new 对象,所以产生的内存溢出问题。
总结
通过一个简单的小案例,学习了一些分析工具,对于生产环境遇到 OOM 异常,我们就可以通过这样的工具来分析问题所在,通过设置一些基本的 JVM 参数来得到 Dump 文件,然后通过工具分析错误位置,这样我们就可以知道什么原因造成的错误,最后,给大家总结了几条常用的 JVM 参数,请笑纳。
-Xms 设置初始化内存分配大小 默认占比系统的 64/1
-Xmx 设置最大分配内存 默认占比系统的 4/1
-XX:+PrintGCDetails 打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError OOM Dump 文件