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

本篇文章只讲述在遇到 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 文件

猜你喜欢

转载自blog.csdn.net/qq_43647359/article/details/107129431
今日推荐