JVM遇到OOM如何排错,如何使用工具分析问题所在,这篇文章告诉你!

    技术2025-12-23  16

    本篇文章只讲述在遇到 OOM (java.lang.OutOfMemoryError:Java heap space) 这种情况如何利用工具分析问题,找到问题所在,关于JVM原理这方面的不过多深究。大家有兴趣的可以自行百度 本篇参考:狂神说 Java https://www.bilibili.com/video/BV1iJ411d7jS?p=9

    文章目录

    步骤一:准备一个简单的案例步骤二:下载 jprofiler 分析工具第三步:IDEA 插件安装第四步:运行代码(设置 JVM 运行参数)步骤五:JProfile 分析 Dump 文件1. JProfiler(Biggest Objects 界面)2. JProfiler(Thread Dump 界面) 总结

    步骤一:准备一个简单的案例

    首先,我们准备一个会触发 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 文件
    Processed: 0.017, SQL: 9