【JVM】OOM错误展现-原理-解决方案

模拟OOM错误的产生

1、 编写代码

public class OOMError {
    // 模拟OOM错误:
        // 将JVM参数调小,方便模拟OOM错误   -Xms8m -Xmx8m -XX:+PrintGCDetails
    public static void main(String[] args) {
        String s = "qwertyuiopasdfghl";

        while (true){
            s += s + new Random().nextInt(888888888) + s + new Random().nextInt(888888888);

        }
    }
}

2、 修改JVM参数(调小,堆内存容易满)
在这里插入图片描述
在这里插入图片描述

3、运行查看错误及分析
在这里插入图片描述

OOM解决方案

1、尝试扩大内存,看结果,仍未解决,进入步骤2;
2、分析内存,看一下哪个地方出现了问题(专业工具:内存快照分析工具):

  • 最快:使用内存快照分析工具(Eclipse使用MAT,Idea使用Jprofiler)
  • 最慢:Debug,一行行分析代码
    MAT,Jprofiler作用:
  • 分析Dump内存文件,快速定位内存泄漏;
  • 获得堆中的数据
  • 获得大的对象

1、安装Jprofiler插件:
在这里插入图片描述
2、下载jprofiler客户端
https://www.ej-technologies.com/download/jprofiler/version_92

3、配置ide
在这里插入图片描述

4、定位错误具体位置

  • 测试代码:
package JVM.test;

import java.util.ArrayList;

/**
 * TODO 测试OOM错误、JVM调优
 * 将JVM参数调小,方便模拟OOM错误
 * -Xms 设置初始化内存分配大小 1/64
 * -Xmx 设置最大内存分配,默认 1/4
 * 打印GC垃圾回收信息:-Xms8m -Xmx8m -XX:+PrintGCDetails
 * OOM错误DUMP文件:-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
 */
public class OOMError {
    // 模拟OOM错误:
        //

    byte[] array = new byte[1*1024*1024];   // 1m

    public static void main(String[] args) {

        ArrayList<OOMError> list = new ArrayList<>();

        int count = 0;
        try {
            while (true){
                list.add(new OOMError());   // 通过Jprofiler发现问题所在行26
                count = count +1;
            }
        }catch (Error e){
            System.out.println("count:"+count);
            e.printStackTrace();
        }


    }
}
  • 运行结果:
    出现错误,使用Exception并未捕获到异常,未输出执行次数,所以使用Error捕获
    在这里插入图片描述

  • 加配置信息,进行错误排查
    在这里插入图片描述

  • 错误信息已经dump下来,去项目根目录中查找该文件
    在这里插入图片描述
    在这里插入图片描述

  • 打开该文件
    在这里插入图片描述
    在这里插入图片描述
    注:找到问题以后,将项目中的java_pid1800.hprof.analysis文件夹删除,因为里面生成和很多文件。
    在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值