背景
项目为docker部署的springboot单体项目(非前后端分离),前端文件是集成在项目的类路径的resources路径下的。项目使用ruoyi-vue版本做为开发原始代码。
系统目前没什么用,主要是客户分公司在基础数据模块录入数据比较多,目前系统数据记录条数在122W+。
现象
系统运行一段时间,就会出现以下报错,且系统是不可用的状态:




排查过程
- 使用命令docker logs -f 容器名称/容器Id,查看日志发现关键提示信息:

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


3. 接下来是将线上的程序,分配一定的JVM初始及最大堆内存大小运行:
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home
参数说明
-Xms 初始堆内存大小
-Xmx 最大堆内存大小
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath 表示在出现堆内存溢出时,在哪个目录生成dump文件,这里指定了容器内部的home目录,且此必须存在

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

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


以上就是自己总结的内存溢出排查方法,大家可以参考,欢迎大佬指正!!
文章描述了一种针对Docker部署的Springboot单体项目内存溢出问题的排查流程。通过dockerlogs获取日志,使用MemoryAnalyzer(MAT)工具分析内存dump文件,关注Histogram、dominator_tree和thread_overview来定位问题。建议调整JVM堆内存参数并及时生成dump文件以辅助诊断。
1595

被折叠的 条评论
为什么被折叠?



