当前位置: 首页 > news >正文

如何分析 JVM OOM 内存溢出 Dump 快照日志

文章目录

  • 1、需求背景
  • 2、OOM 触发
  • 3、Dump 日志分析

1、需求背景

企业开发过程中,如果系统服务客户量比较大,偶尔会出现OOM内存溢出问题,导致服务发生宕机,停止对外提供访问。

这种情况就需要排查定位内存溢出的原因(总不能任由他宕机),不过默认情况JVM内存溢出导致宕机并不会生成dump快照,开发就很难找到本次内存溢出的原因。

这就需要我们在JAR包启动命令中添加一些参数,例如:-XX:+HeapDumpOnOutOfMemoryError,这样就会生成对应OOM Dump快照,方便研发排查内存泄露原因,参数如下:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog

2、OOM 触发

本次演示,我通过Docker方式来启动Java进程,所以需要先构建Docker镜像,我这里使用Dockerfile来完成镜像构建:

# 基于JDK8基础镜像
FROM openjdk:8

# 容器中创建 applog 目录(存放dump文件)
RUN mkdir -p /applog

# 将宿主机jar添加到容器中
ADD MyProject-0.0.1-SNAPSHOT.jar /MyProject-0.0.1-SNAPSHOT.jar

# 配置:生成HeapDump快照日志
ENV JAVA_OPTS="-Xms256M -Xmx256M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /MyProject-0.0.1-SNAPSHOT.jar"]

然后使用命令进行镜像文件构建并运行容器:

# 构建镜像
docker build -f Dockerfile -t oom-project .
# 启动容器
docker run -d -p8080:8080 oom-project

上述构建配置文件,如果没有JAVA_OPTS参数配置,即便是发生OOM也不会生成对应Dump文件。基于上述配置构建出镜像后,就可以完成服务启动,然后在浏览器上输入URL完成接口调用,触发接口调用,大概过了几秒钟就出现了OOM内存泄露问题,如下图:
在这里插入图片描述

3、Dump 日志分析

由于上面触发了OOM,那么就会在Docker容器内部的 applog 文件夹中可以看到 dump 文件了:

# 进入Docker容器内部
docker exec -it 容器id bash

进入到 applog 目录,可以看到对应的 dump 文件:java_pid7.hprof
在这里插入图片描述
此时,就可以把容器内的dump快照文件拷贝到宿主机当中:

docker cp 容器id:/applog/java_pid7.hprof /opt

接着,就可以将生成的 OOM dump 快照文件下载到电脑本地文件夹中:
在这里插入图片描述
最后,就要用分析工具进行分析了,现在开源了很多 Dump 分析工具,例如:Eclipse MAT,不过我个人不习惯使用MAT(还得单独安装),不如直接通过IDEA自带工具进行分析,直接把该文件拖入到IDEA界面中,就可以看到,存在大对象导致内存溢出:
在这里插入图片描述
接着看一下具体是哪个类、哪行代码出现了问题:OOMController类的21行
在这里插入图片描述
最后看一眼代码:原来是/oom接口中,存在死循环不断向List中添加对象,最后导致Heap内存发生了OOM现象:
在这里插入图片描述

相关文章:

  • ​印太贸易新轴心成型:澳新领衔的“关税破壁行动“​
  • VUE项目中的package.json中的启动脚本
  • 深入浅出:Seata 分布式事务管理器的部署与安装实战指南
  • CAP应用
  • 大模型之Transformers , PyTorch和Keras
  • 【Python爬虫】简单案例介绍2
  • iOS 设备配置和描述文件管理
  • Framework Binder架构分解
  • 双按键控制LED(中断优先级)
  • ‌DeepSeek模型在非图形智能体的应用中是否需要GPU
  • 印度zj游戏出海代投本土网盟广告核心优势
  • 程序化广告行业(84/89):4A广告代理公司与行业资质解读
  • 【计算机网络】网络基础(协议,网络传输流程、Mac/IP地址 、端口号)
  • 高并发内存池(定长内存池基础)
  • STM32 认识STM32
  • 【AI飞】AutoIT入门一:AutoIT来了,准备让AI动起来
  • 数据库实战篇,SQL在Kooboo中的实际应用(一)
  • Epplus 8+ 许可证设置
  • ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(系列开篇)
  • 【NLP】25.python实现点积注意力,加性注意力,Decoder(解码器)与 Attention
  • 外交部:中企在中韩暂定水域建立渔业养殖设施不违反中韩有关协定
  • 姜仁华任中国水稻研究所所长,胡培松院士卸任
  • 皓元医药郑保富:共创、共赢、共享,跨域协作推动生物医药创新
  • 硅基世界的“缘分”——系统与人工智能携手进化
  • 黄山景区成功搜救一名“野游”游客,当事人受处罚并付救援费
  • 国家统计局:今年增量政策和存量政策一起发力,推动了经济实现良好开局