同事写了一条 SQL,把 MyBatis 都干翻了。。
前言继上次线上CPU出现了报警这次服务又开始整活了风平浪静了没几天看生产日志服务的运行的时候频繁的出现OutOfMemoryError就是我们俗称的OOM这可还行频繁的OOM直接会造成服务处于一个不可用的情况通过Skywalking查看链路调用基本全报红了基本处于一个瘫痪状态因为生产该服务是分布式部署运维当即立断对该服务进行重启因为是B端的产品先让公司业务能用起来了保证服务的正常使用然后紧急查看问题当然这个问题就来到了我这里既然分配给我了咱高低给它查出来并且修复了。OutOfMemoryError出现的原因先来了解下OutOfMemoryError出现的原因无非就是两类堆内存空间不足、元空间不足堆内存空间不足意味着程序存在一直有引用的对象强引用主要对象在引用的状态就无法被GC回收撑爆了-Xmx堆拓展的最大值内存不足自然就会触发堆内存溢出。元空间Java 8引入了元空间概念代替了之前堆的永久代由于元空间属于堆外内存不需要有对象引用通过指针的方式表示类和元数据之所以引用元空间就是一种JDK的升级优化避免了永久代的内存溢出。常见堆内存溢出的几种情况查询数据库返回的数据量过大加载到内存中导致内存溢出代码中出现死循环情况导致大对象一直被引用不能被GC回收资源链接池、io流在使用完没有进行手动释放静态集合类里面存在引用对象始终存在引用关系没有进行清除以上属于常见的几种堆内存溢出的场景当然有时候我们的遇到的问题都是稀奇古怪的问题常见的问题总是很少能遇到…现象分析根据生产环境的报错日志来看这边属于Mybatis报出的一个内存溢出情况通过去看Mybatis源码发现底层也是通过一些集合类来存放拼接的sql那么当然也有可能出现堆内存溢出而且在sql体积比较大的情况下接收sql的集合就会变的非常大如果回收不了那么就会导致内存溢出。由于我们docker容器里面没有一些jstack、jmap的工具并且dump文件也没有进行保存…导致我无法通过看线程高占用内存的对象来分析具体是什么操作发生的内存溢出这就难了… 于是只能去网上搜搜看了没想到真的给到我一些启发并且有点思路大概知道是哪里的问题。文章来源于zzzzbw作者写一篇关于 《惨遭DruidDataSource和Mybatis暗算,导致OOM》很感谢这位作者给我带来的启发。 文章作者也遇到了Mybatis带来的OOM主要是因为Mybatis拼接SQL的时候生成的占位符和参数对象存放在Map里当SQL的参数多导致SQL太长的时候Map持有这些SQL时间较长并且多线程同时操作这时候内存占用就很高从而发生OOMMybatis源码分析通过对DynamicContext类源码查看DynamicContext又一个ContextMap 类型的参数bindings继承了HashMap相当于一个Map集合接着看这个类中的getBindings方法看到了ForEachSqlNode这类调用了getBindings方法简单的说就是ForEachSqlNode通过getBindings方法将SQL参数和参数的占位符统一put到ContextMap这个集合里面主要是这里面的参数和占位符无法被GC回收并发查询量多的情况下就会导致OOM。情景复现随后我做了线上场景的复现通过将SQL语句的拼接将IN里面的参数变大然后创建50个线程进行执行将JVM堆内存设为-Xmx256m -XX:PrintGCDetails -XX:HeapDumpOnOutOfMemoryError这里看控制台打印的日志服务在频繁的进行Full GC导致OOM。总结既然发现了问题出现的原因接下来就是对代码SQL进行优化尽量避免在sql拼接的时候体积过大这里告诫我们代码不能乱写SQL语句也不能随意写啊有时候把问题想的过于简单确实会带来不可预知的风险。

相关新闻

= delete和= default

= delete和= default

你想弄明白C中 delete和 default这两个语法的区别与用法,它们是C11引入的核心特性,主要用于精准控制类的特殊成员函数(如构造函数、拷贝构造、赋值运算符等)。我会用通俗的语言实战示例,讲清两者的核心用途、区别和使用…

2026/7/3 15:10:42 阅读更多 →
第二届人工智能赋能数字创意设计国际学术会议(AIEDCD 2026)意大利会场

第二届人工智能赋能数字创意设计国际学术会议(AIEDCD 2026)意大利会场

第二届人工智能赋能数字创意设计国际学术会议 (AIEDCD 2026) 将于2026年3月27-29日在中国北京&意大利召开。会议主要围绕人工智能与数字创意设计等研究领域展开讨论。会议旨在为从事相关研究领域的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&…

2026/7/5 16:21:44 阅读更多 →
在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南 引言:当你的技能成为“硬通货” 在杭州的创意市集上,有位手作匠人从不使用收款二维码。她的顾客用“故事交换”购买作品——讲述一个关于传承的故事,就能带走一件蓝染…

2026/7/5 7:52:03 阅读更多 →

最新新闻

Linux系统基础2:Windows 连接嵌入式设备 + 状态查看完整教程

Linux系统基础2:Windows 连接嵌入式设备 + 状态查看完整教程

Windows 连接Linux 设备主要有两种方式,我会从硬件接线到命令操作逐步骤拆解,每个命令都结合嵌入式场景举例说明:串口调试连接:兜底基础方式,无网络也能连,适合首次调试、看启动日志、配置网络SSH 网络连接…

2026/7/6 13:58:51 阅读更多 →
Linux系统基础1:Linux 命令超详细逐成分拆解教程

Linux系统基础1:Linux 命令超详细逐成分拆解教程

近期使用Linux系统下的QT,所有经常用到Linux 命令,从最底层逻辑讲起,每个例子都逐字符拆解:这部分是什么、为什么要这么写、不写 / 写错会怎么样,完全从新手视角出发,帮助理解命令的设计逻辑,而…

2026/7/6 13:58:51 阅读更多 →
第38篇:数据组织(一):数据所有者的角色与责任

第38篇:数据组织(一):数据所有者的角色与责任

从“交出数据”到“守护数据”——DISC-DAMA数据所有者的职责重定义 一、一个数据所有者的困惑 老孙是某制造企业的销售总监。在公司的数据治理章程里,他的另一个身份是“客户数据”和“销售数据”的数据所有者。这个头衔挂了三年,但他一直不太清楚它具…

2026/7/6 13:56:49 阅读更多 →
LinkSwift:9大网盘直链下载助手完整使用指南与优化方案

LinkSwift:9大网盘直链下载助手完整使用指南与优化方案

LinkSwift:9大网盘直链下载助手完整使用指南与优化方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

2026/7/6 13:56:49 阅读更多 →
第35篇:数据应用:从“开发报表”到“组装能力”

第35篇:数据应用:从“开发报表”到“组装能力”

需求→能力市场→订阅→本地部署——DISC-DAMA数据应用开发的新范式一、一个业务部门的漫长等待某企业销售总监老赵,在一季度的战略会上提出了一个数据分析需求:“我想看各渠道的促销ROI对比。哪些渠道的促销在真正拉动销售?哪些是在浪费预算…

2026/7/6 13:56:49 阅读更多 →
美团ElasticSearch实践

美团ElasticSearch实践

美团ElasticSearch实践美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-Based Service(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-Length Encoding(RLE)设计了一款高效的倒排索引…

2026/7/6 13:54:48 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻