记录一次线上OOM问题排查处理过程

背景

项目为docker部署的springboot单体项目(非前后端分离),前端文件是集成在项目的类路径的resources路径下的。项目使用ruoyi-vue版本做为开发原始代码。
系统目前没什么用,主要是客户分公司在基础数据模块录入数据比较多,目前系统数据记录条数在122W+。

现象

系统运行一段时间,就会出现以下报错,且系统是不可用的状态:
在这里插入图片描述
记录一次线上OOM问题排查处理过程_第1张图片
记录一次线上OOM问题排查处理过程_第2张图片
记录一次线上OOM问题排查处理过程_第3张图片

排查过程

  1. 使用命令docker logs -f 容器名称/容器Id,查看日志发现关键提示信息:
    在这里插入图片描述
    也就是Java堆内存溢出

2. 接下来一顿度娘,发现可以使用Memory Analyzer做分析,于是到官网下一波: https://www.eclipse.org/mat/downloads.php
选择中国镜像源

记录一次线上OOM问题排查处理过程_第4张图片
记录一次线上OOM问题排查处理过程_第5张图片
3. 接下来是将线上的程序,分配一定的JVM初始及最大堆内存大小运行:

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home

参数说明

-Xms 初始堆内存大小
-Xmx 最大堆内存大小
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath 表示在出现堆内存溢出时,在哪个目录生成dump文件,这里指定了容器内部的home目录,且此必须存在

在这里插入图片描述

  1. 接下来使用MAT工具打开文件后,依次查看下图标红的地方,对代码进行分析
  • 占用内存过大的对象有哪些(Histogram)
  • 被谁引用(dominator_tree)
  • 定位到具体的代码(thread_overview)

记录一次线上OOM问题排查处理过程_第6张图片

  1. 如果担心dump文件大,占用磁盘空间,可以再你排查的时候,再进行生成。
    可以执行以下命令生成:

记录一次线上OOM问题排查处理过程_第7张图片
记录一次线上OOM问题排查处理过程_第8张图片
以上就是自己总结的内存溢出排查方法,大家可以参考,欢迎大佬指正!!

你可能感兴趣的:(java,jvm,开发语言)