java使用jvisualvm做oom内存溢出的分析
·
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打开左上角打开文件

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

更多推荐




所有评论(0)