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

记一次生产环境排查OOM问题,byte[]数组超多

背景

服务部署在内网,单机springboot,我们最近发版比较频繁,基本上每天都会重启应用,最近突然发现会出现OOM问题

排查思路

  1. 首先启动脚本一定得加启动参数,不然什么信息也没有,如果之前没加,那就只能加上后,等下次OOM再排查了
-XX:+HeapDumpOnOutOfMemoryError 设置当首次遭遇内存溢出时导出此时堆中相关信息
-XX:HeapDumpPath=/tmp/heapdump.hprof 指定导出堆信息时的路径或文件名
  1. 把dump文件下载下来,看一下文件的大小和启动参数-Xmx 设置的大小是否差不多,如果dump文件明显小的话先查下其他方向,比如是否在启动时设置了元空间大小(-XX:MaxMetaspaceSize)或者堆外内存大小之类的参数,简而言之就是dump文件如果明显小于设置的堆内存,可能就需要考虑不是堆内存溢出的情况
  2. 找个64位的jdk,打开bin目录下的jvisualvm.exe(openJDK貌似没有),可以下zulu家的或者oracle的
  3. 加载dump文件,记得选到*.hprof
    在这里插入图片描述在这里插入图片描述
  4. 首先点到类这边,看下哪些对象特别多,有时候可以直观的看出问题,但我这边是byte[]特别多,此时猜测是否是有内存泄漏
    在这里插入图片描述
  5. 尝试从byte[]的内容用new String[]转字符串,发现是乱码,所以猜测数据内容应当不是字符串了,也更像内存泄漏了
  6. 点回概要,查找最大的20个对象,这边加载要一会,出来后从第一个查起,一般第一个就是嫌疑最大的
    在这里插入图片描述
    在这里插入图片描述
  7. 在引用处查找最近的gc根节点,说实话看不太懂这个意思,但是就是这样查的
    在这里插入图片描述
  8. 对结果再使用在线程中显示功能
    在这里插入图片描述
  9. 此处打码的地方是我们项目前人自己实现的mybatis分页功能,去看一下此处的代码
    在这里插入图片描述
  10. 红框框起的两个地方,都是实现了AutoCloseable方法的,但是却没有调用对象的close()方法
    在这里插入图片描述
  11. 可以确定问题就在此处了,随着项目体量增大,分页查询越来越多,未关闭的流也越来越多,内存泄漏越来越严重直至项目才运行两三小时就出现OOM
    13.修复也很简单,把流用完关了就完事了

总结

这种系统级别的框架,要么用第三方的,要么就让大佬去写,让半吊子写真的是埋坑,当然也和我所在的是一个垃圾外包团队有点关系,解决了就好了,继续混着。

http://www.dtcms.com/a/303886.html

相关文章:

  • 自动调优 vLLM 服务器参数(实战指南)
  • ArkTS懒加载LazyForEach的基本使用
  • 【Delphi】快速理解泛型(Generics)
  • 疯狂星期四文案网第23天运营日记
  • 第2章 cmd命令基础:常用基础命令(1)
  • 为什么分类任务偏爱交叉熵?MSE 为何折戟?
  • Aspose:构建高效文档处理系统的专业组件选择
  • 无人机数传链路模块技术分析
  • 31.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--财务服务--收支分类
  • Oracle 和 MySQL 中的日期类型比较
  • DeepSeek MoE 技术解析:模型架构、通信优化与负载均衡
  • 四、Linux核心工具:Vim, 文件链接与SSH
  • 暑期算法训练.10
  • 如何选择AI IDE?对比Cursor分析功能差异
  • 【Zabbix】Ansible批量部署ZabbixAgent
  • 三步给小智ESP32S3智能语音硬件接入小程序打通MCP服务
  • X-Forwarded-For解析
  • 海外短剧系统架构设计:从0到1搭建高并发微服务平台
  • 基础算法的系统性总结
  • 分布式微服务--RPC:原理、使用方式、与 HTTP/REST 的区别与选择
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-43,(知识点:晶体管、复合管、达林顿管)
  • 【iOS】类扩展与关联对象
  • 时序数据库选型指南:为什么IoTDB正在重新定义工业大数据规则?
  • 谷歌采用 Ligero 构建其 ZK 技术栈
  • QML 3D曲面图(Surface3D)技术
  • p5.js 从零开始创建 3D 模型,createModel入门指南
  • Adv. Sci. 前沿:非零高斯曲率3D结构可逆转换!液晶弹性体多级形变新策略
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • Marin说PCB之POC电路layout设计仿真案例---10
  • 机械学习--线性回归---三个小案例