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

记录一次发生的OOM异常,OutOfMemoryError: Java heap space

背景

  • 平台上传图片列表压缩文件,大小87M,耗时44s,然后报了500异常。
  • 随后查看后端日志,发现报OutOfMemoryError: Java heap space,但是数据却成功完全添加到mysql中了,特别奇怪。

分析原因

  • 流程:前端解析压缩文件转化为image-base64的json数据 =》传给后端 =》后端解析入mysql。
  • 通过分析OOM日志,发现是AOP切面类往mysql插入操作日志时产生的OOM异常。
  • 但是内存只多了大约100M数据(图片文件转base64后会变大),难道就真的差这100M数据就达到极限吗?查看JVM进程信息,堆内存给的1G,确实有点小,但是这个服务本身就属于配置类的服务,也应该够用了。
  • 后面发现同时还存在一个定时任务,每隔10s就要从mysql中取一次图片base64数据,原因应该就是image-base64数据刚插入mysql,随之定时任务就执行了,将刚插入的数据又拿到内存中,此时瞬间占用将近200M内存
  • 具体报错位置是JSON.toJSONString()方法,操作日志会保存body体参数,当序列化body体参数时,系统直接崩溃了。

解决

1、堆内存增加到2G。
2、限制body体大小。

  • 正常情况改SpringBoot的一个配置(server.tomcat.max-http-post-size: 100MB)就行了,但是在SpringBoot 2.4.0版本之后,该配置就被移除了。
  • 只留下server.tomcat.max-http-form-post-size=2MB(这个专门限制application/x-www-form-urlencoded表单提交的形式)、server.tomcat.max-swallow-size=2MB(这个表示当超出限制便不再读取了,避免内存溢出)、spring.servlet.multipart.max-request-size=2MB(这个专门限制multipart/form-data文件上传),但是此时请求是application/json类型,所以这几个都不能用。
  • 最后只能写一个filter来限制了。

3、json序列化时忽略不必要的参数。

  • 像image-base64这类数据根本没必要存,所以直接忽略。
  • @JSONField(serialize = false, deserialize = false),仅作用于FastJSON,并且不影响ORM框架。
  • private transient String imageBese64,作用于FastJSON/Gson/Jackson/输入输出流等,不影响ORM框架。
http://www.xdnf.cn/news/712711.html

相关文章:

  • 【笔记】suna部署之获取 OpenRouter API key
  • DFS:从入门到进阶的刷题指南
  • solidworks报错-只有合并特征才能被阵列。如果恰当,请选择实体的阵列
  • 表里不一的程序世界和物理世界
  • Linux日志管理
  • 【LangChain】
  • CAN通信波特率异常的危害
  • 用Python绘制动态爱心:代码解析与浪漫编程实践
  • 进行性核上性麻痹健康护理全指南:从症状管理到生活照护
  • 杏仁海棠花饼的学习日记第十四天CSS
  • 亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应
  • 树莓派超全系列教程文档--(52)如何启用VNC功能
  • electron安装报错处理
  • K M G T P E Z
  • ChatGPT Plus/Pro 订阅教程(支持支付宝)
  • opengauss 数据库安装主备 非om方式
  • 11 java语言执行浅析1
  • spring boot 拦截器HandlerInterceptor 不生效的原因排查
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(二十一)
  • Shortest path 代码
  • RV1126-OPENCV 交叉编译
  • vue发版html 生成打包到docker镜像进行发版
  • STM32F103_Bootloader程序开发05 - Keil修改生成文件的路径与文件名,自动生成bin格式文件
  • Unity3D仿星露谷物语开发55之保存游戏到文件
  • ubuntu20.04编译 pjproject-2.7.1
  • 删除并重新排队
  • Redis 主从复制中的全量拷贝机制详解
  • IBM DB2数据库管理工具IBM Data Studio
  • Ubuntu 安装 Miniconda 及配置国内镜像源完整指南
  • 源的企业级网络安全检测工具Prism X(棱镜X)