一次 OOM 线上排查实录
、问题现场线上内存飙高OOM 报警某天线上老项目突然收到服务器内存使用率持续飙高的报警紧接着应用直接抛出 OOM 错误服务崩溃。紧急拉取了堆 Dump 文件用 JProfiler 打开后直接看到了内存占用的元凶大量com.alibaba.druid.proxy.jdbc相关对象堆积堆中最大的单个对象是一个char[]大小超过 500MB存储的正是项目中执行的 SQL 字符串结合项目业务场景初步判断是数据库操作相关的内存泄漏定位方向直接锁定了代码中的 SQL 操作和 Druid 连接池配置。二、根因定位双重问题叠加导致的灾难顺着堆 Dump 里的 SQL 文本我直接定位到了业务代码发现这次 OOM 是两个问题叠加导致的。1. 业务代码SQL 拼接逻辑导致大对象堆积这是一个老项目当年的开发同学已经离职了代码里存在这样的逻辑单条INSERT语句中通过循环拼接 SQL 字符串一次性插入大量数据当数据量较大时拼接后的 SQL 字符串会变得非常大生成的char[]对象直接占用几百 MB 内存这些大字符串被线程栈引用短时间内无法被 GC 回收直接推高了内存水位2. 框架层面Druid 1.1.22 版本的经典 SQL 缓存泄漏堆 Dump 中大量的 Druid 对象指向了一个更致命的问题Druid 连接池的 SQL 统计缓存。项目使用的 Druid 版本是1.1.22这个版本存在一个广为人知的问题SQL 统计功能会无限制缓存所有执行过的 SQL 字符串无法自动清理项目中拼接的大量不同 SQL会被 Druid 全部缓存到sqlStatMap中这些对象会一直持有 SQL 字符串的引用导致它们无法被 GC 回收随着服务运行时间增长缓存的 SQL 越来越多内存只会涨不会跌最终撑满堆内存触发 OOM三、解决方案两步走彻底根治问题针对这两个问题我们采用了业务框架双管齐下的修复方案从根源解决内存泄漏。第一步优化 Druid 配置掐断缓存泄漏直接修改项目的 Druid 配置关闭无限制的 SQL 统计同时限制缓存大小避免内存无限增长。方案 A彻底关闭 SQL 统计推荐零泄漏风险spring: datasource: druid: filter: stat: enabled: false # 关闭导致内存泄漏的SQL统计 web-stat-filter: enabled: false # 关闭Web统计减少额外内存占用方案 B保留监控限制缓存大小折中方案如果业务必须保留 SQL 监控可以通过配置限制缓存的 SQL 数量避免无限增长spring: datasource: druid: filter: stat: enabled: true max-stat-count: 200 # 限制最多缓存200条SQL超出自动淘汰第二步重构业务代码替换 SQL 拼接为批量插入修改原有的 SQL 拼接逻辑改为标准的批量插入方式既避免了超大 SQL 字符串的生成也提升了数据库写入性能。改造前问题代码// 循环拼接SQL生成超大字符串 StringBuilder sql new StringBuilder(INSERT INTO t_invoice (col1, col2) VALUES ); for (Invoice invoice : list) { sql.append((?, ?),); } jdbcTemplate.update(sql.toString(), params);改造后批量插入// 使用JdbcTemplate批量插入避免生成超大SQL字符串 String sql INSERT INTO t_invoice (col1, col2) VALUES (?, ?); jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, list.get(i).getCol1()); ps.setString(2, list.get(i).getCol2()); } Override public int getBatchSize() { return list.size(); } });四、效果验证与后续优化改造完成后我们重新上线服务并进行了压测验证内存曲线恢复平稳不再出现持续飙高的情况堆 Dump 中 Druid 相关对象和大char[]基本消失数据库写入性能也有明显提升单批次插入耗时降低了 40%额外优化建议对于老项目建议升级 Druid 到最新稳定版如1.2.20修复了大量已知的内存泄漏问题批量插入时建议设置合理的批次大小如每批 100-500 条避免单次操作过大导致数据库压力上线前务必进行压测通过 JProfiler 或 Arthas 观察内存变化提前发现潜在问题

相关新闻

【Android Audio】BLE Audio 音量同步与连接路由架构拆解

【Android Audio】BLE Audio 音量同步与连接路由架构拆解

BLE Audio 音量同步与连接路由架构拆解 本技术文档基于 Android Framework 与 Bluetooth 协议栈源码,针对 BLE Audio (LE Audio) 场景下设备的音量同步机制、音量阶梯转换算法以及连接/断开状态机与音频路由切换逻辑进行深入的架构级拆解。1. 音量同步机制 (Volume …

2026/7/8 3:41:32阅读更多 →
一招搞定!经纬度转海拔,批量自动填充,坐标信息一键导出

一招搞定!经纬度转海拔,批量自动填充,坐标信息一键导出

适用场景:测绘、规划、环境监测、地质勘查等领域的批量高程数据处理前言 本文将系统介绍如何利用 Bigemap Pro 软件,依据已有的经度、纬度数据,实现海拔值的快速自动识别与批量填充,同时支持输出带坐标信息的完整成果数据。一、数…

2026/7/8 3:36:32阅读更多 →
AI竞争的焦点是AIGS不是AIGC

AI竞争的焦点是AIGS不是AIGC

从对话到执行,AI竞争变了过去一年,AI应用的关注点是什么?"谁的大模型更聪明"、"谁的回答更准确"、"谁的对话体验更好"。但这些竞争正在发生变化。AI应用的竞争正在从"谁能更好地对话"转向"谁能…

2026/7/8 3:36:32阅读更多 →
【计算机Java毕业设计案例】基于 SpringBoot 的公交实时信息推送系统的设计与实现 基于小程序的公交收藏与出行规划系统(程序+文档+讲解+定制)

【计算机Java毕业设计案例】基于 SpringBoot 的公交实时信息推送系统的设计与实现 基于小程序的公交收藏与出行规划系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/8 4:36:47阅读更多 →
音视频转文字工具实测:短视频创作者效率翻倍方案

音视频转文字工具实测:短视频创作者效率翻倍方案

做短视频创作的朋友应该都有同感:每天花在「扒文案」和「拍口播」上的时间,远远超过了实际剪辑和构思的时间。尤其对于日更型创作者来说,效率就是生命线。我过去半年试了市面上主流的音视频转文字工具,最终形成了一套稳定高效的工…

2026/7/8 4:36:47阅读更多 →
论人类原生系统实证科学的东方源头 —— 以《墨经》为核心证据解构古希腊人造科学叙事

论人类原生系统实证科学的东方源头 —— 以《墨经》为核心证据解构古希腊人造科学叙事

核心内容摘要:这篇文章是一篇学术论文,其核心论点是:‌人类完整、系统的科学源头在中国先秦墨家,而非古希腊;现行的“古希腊科学起源”叙事是近代欧洲为服务殖民扩张而人为建构的。‌一、核心论点‌文章挑战了全球通行…

2026/7/8 4:36:47阅读更多 →
Linux环境变量学习心得:弄懂变量、PATH与数组

Linux环境变量学习心得:弄懂变量、PATH与数组

前言 刚接触Linux的时候我一直有两个疑问:为什么系统自带命令随便输就能跑,自己写的小程序却要输完整路径;临时定义的变量一关终端就没了。把环境变量整套实操做完后才理清背后逻辑,下面分享完整知识点。 一、环境变量基础概念 环…

2026/7/8 4:36:47阅读更多 →
论流行和金钱矛盾关系

论流行和金钱矛盾关系

金钱不是凭空产生的,它本质上是社会对价值创造的货币化确认;而流行并不是大众喜欢什么,而是社会需求、资本、政策、技术和人才共同汇聚形成的方向。因此,流行决定需求(相辅相成),需求决定价值&a…

2026/7/8 4:36:47阅读更多 →
Frida逆向工程实战:从环境搭建到Hook调试的完整避坑指南

Frida逆向工程实战:从环境搭建到Hook调试的完整避坑指南

1. 项目概述:为什么我们需要一份“避坑指南”? 如果你在逆向分析或者安全测试领域摸爬滚打过一段时间,Frida这个名字对你来说一定不陌生。它就像一把瑞士军刀,功能强大,能让你在运行时动态地窥探和修改目标应用的行为…

2026/7/8 4:31:47阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →