首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
同事写了一条 SQL,把 MyBatis 都干翻了。。 ...
返回列表
发新帖
同事写了一条 SQL,把 MyBatis 都干翻了。。
[复制链接]
发表于 2024-2-4 22:58:07
|
显示全部楼层
|
阅读模式
作者:Lxlxxx
链接:
https://juejin.cn/post/7221461552343072828
前言
继上次线上CPU出现了报警,这次服务又开始整活了,风平浪静了没几天,看生产
日志
服务的运行的时候,频繁的出现OutOfMemoryError,就是我们俗称的OOM,这可还行!
频繁的OOM直接会造成服务处于一个不可用的情况,通过Skywalking查看链路调用,基本全报红了,基本处于一个瘫痪状态,因为生产该服务是分布式部署,运维当即立断对该服务进行重启,因为是B端的产品,先让公司业务能用起来了,保证服务的正常使用,然后紧急查看问题,当然这个问题就来到了我这里,既然分配给我了,咱高低给它查出来,并且修复了。
OutOfMemoryError出现的原因
先来了解下OutOfMemoryError出现的原因,无非就是两类堆内存空间不足、元空间不足
堆内存空间不足:意味着程序存在一直有引用的对象(强引用),主要对象在引用的状态就无法被GC回收,撑爆了-Xmx堆拓展的最大值,内存不足自然就会触发堆内存溢出。
元空间:Java 8引入了元空间概念,代替了之前堆的永久代,由于元空间属于堆外内存,不需要有对象引用,通过指针的方式表示类和元数据,之所以引用元空间就是一种JDK的升级优化,避免了永久代的内存溢出。
常见堆内存溢出的几种情况
查询
数据库
返回的数据量过大,加载到内存中导致内存溢出;
代码
中出现死循环情况,导致大对象一直被引用不能被GC回收;
资源链接池、io流在使用完没有进行手动释放;
静态集合类里面存在引用对象,始终存在引用关系,没有进行清除;
以上属于常见的几种堆内存溢出的场景,当然有时候我们的遇到的问题都是稀奇古怪的问题,常见的问题总是很少能遇到…
推荐一个开源免费的 Spring Boot 实战项目:
https://github.com/javastacks/spring-boot-best-practice
现象分析
根据生产环境的报错
日志
来看,这边属于Mybatis报出的一个内存溢出情况,通过去看Mybatis源码发现,底层也是通过一些集合类来存放拼接的sql,那么当然也有可能出现堆内存溢出,而且在sql体积比较大的情况下,接收sql的集合就会变的非常大,如果回收不了那么就会导致内存溢出。
由于我们docker
容器
里面没有一些jstack、jmap的工具,并且dump文件也没有进行保存…导致我无法通过看线程高占用内存的对象,来分析具体是什么操作发生的内存溢出,这就难了… 于是只能去网上搜搜看了,没想到真的给到我一些启发,并且有点思路大概知道是哪里的问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
回复
使用道具
举报
返回列表
泉缘泉
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表