JAVA内存分析:基于dump内存溢出快照分析

JAVA内存分析

引言

Java程序在服务端运行的时候,在长时间运行或者访问量较大的时候,会遇见内存溢出的情况。
这时如果我们没有进行JVM的内存分析,将无法对问题进行定位,那么我们即使对服务端进行重启,在后续的运行过程中,还是会预见内存溢出的情况。
那么我们结合实际情况,通过一些实例来模拟内存溢出的情况,及如何去分析。

正文

1,模拟内存溢出

1.1 新建一个bean对象
package com.moonl.jvm.beans;

public class MemoryOverflow {
    
    
}
1.2 建一个main方法来进行程序的运行
package com.moonl.jvm;

import com.moonl.jvm.beans.MemoryOverflow;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
public class MemoryOverflowTest {
    
    


    public static void main(String[] args) {
    
    
        List<MemoryOverflow> list = new ArrayList<>();
        while (true){
    
    
            list.add(new MemoryOverflow());
        }

    }
}
1.3 设置运行时的内存

在这里插入图片描述
这里我们设置运行时的内存为21M
在这里插入图片描述
现在我们开始运行程序
这时一段很简单的代码,无限循环,不断的将创建一个对象,并加入到list当中,此时我们发现报错提示,内存溢出了。
我们生产环境,系统后台的运行时内存溢出,就这样模拟出来了。
在这里插入图片描述

2,定位问题

当我们生产环境,出现内存溢出之后,面对量级比较大的系统,一般是无法通过日志进行定位内存溢出的位置,那么就需要在运行时,加上一段参数,生成运行时内存溢出的快照。
-Xms21m -Xmx21m -XX:+HeapDumpOnOutOfMemoryError
如图所示:
在这里插入图片描述

运行后,会出现如图所示:
在这里插入图片描述
在程序的工程目录报里面,我们就可以找到,刚生成的文件快照,但该文件的阅读方式,需要单独下载单独的工具进行查询。
这里我使用的是:Jprofiler 大家可以去下载,安装过程不再累述。
在这里插入图片描述

3,分析内存溢出的原因

打开Jprofiler—Session—open Snapshot
在这里插入图片描述
弹出对话框后,选择要进行分析的文件
在这里插入图片描述
就可以看到是什么原因造成内存溢出的,当然在进行生产环境的内存溢出分析时,需要排查和分析的地方更多
在这里插入图片描述

后记

总结一下,本文所述的方法是在采用在vm options:-Xms21m -Xmx21m -XX:+HeapDumpOnOutOfMemoryError,中
添加HeapDumpOnOutOfMemoryError,生成快照日志完成的,下一期,我们将讲解通过idea和jprofiler进行整合,查看
内存运行情况。
下一篇-JAVA内存分析:idea集成jprofiler查看JVM内存使用情况

猜你喜欢

转载自blog.csdn.net/liaoyue11/article/details/110822020