1、概述

主要使用jdk自带工具jvisualvm对程序出现oom进行简单的代码问题得到定位和分析

2、准备阶段

准备一个springboot程序并撰写一个测试接口能够让程序导致内存溢出代码如下:

    //写一个测试接口
    @GetMapping("/test")
    public String getTasks() {
        int size=1024 * 1024 *80;
        List<byte[] > list =new ArrayList<byte[]>();
        for (int i=0;i<1024;i++){
            System.out.println("JVM 写入数据"+(i+1)+"M");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new byte[size]);  //每一秒就往堆中写入一个数据
        }
        return "success";
    }

3、复现问题

启动该springboot程序并调用该接口,期间可以使用工具对堆内存状态进行监控,发现ed区不断gc,且old区内存不断增高,最终程序oom发生内存溢出

4、分析问题

基于现象我们通过设置java的启动并添加生成dump堆的分析文件快照

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\code\ActivitiDemo\backend\heapdump.hprof

当发生oom时会自动生成快照文件我们基于文件进行分析

5、分析结果

生成后会自动在文件夹生成heapdump.hprof文件结尾的文件,我们通过工具jvisualvm打开左上角打开文件

打开后我们点击异常错误线程,就会能看到具体问题代码

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐