线上故障排查——drools规则引擎使用不当导致oom
正文
1. 事件回溯
1、7月26日上午11:34,告警邮件提示:tomcat内存使用率连续多次超过90%;
2、开发人员介入排查问题,11:40定位到存在oom问题,申请运维拉取线上tomcat 内存快照dump;
3、开发人员担心服务抗不过下午的业务高峰期,让运维在中午低谷期间重启tomcat;
4、11:45,运维人员重启tomcat,内存使用回落。
2. 事件分析
1、根据监控历史数据,发现7月10日后,内存逐步上升,且不能被full GC;怀疑和前一周版本有关,但检查前一周版本内容,不可能导致omm;
2、拿到线上dump文件分析,发现drools规则引擎相关对象占据了90%的内存,初步断定和drools的使用有关;
3、走读代码和drools的使用手册,发现使用不当:在使用完drool的fact对象后,未能及时释放,导致对象无法回收;
4、再回溯drools使用业务场景为当前app版本的新功能提供服务,新版本刚好在7月10日左右发布市场,所以,内存飙高最先出现在7月10日。
整个现象解释通畅。
3. 问题修复
1、在本地环境压力测试模拟线上情况,重现oom;
2、更改drools相关使用代码,加上资源释放逻辑。
更改前:
1 2 3 4 5 6 7 8 9 10 | { ....... kSession.insert(fact); kSession.fireAllRules(); ....... } |
更改后:
1 2 3 4 5 6 7 8 9 10 11 | { ....... FactHandle handle = kSession.insert(fact); kSession.fireAllRules(); kSession.delete(handle); ........ } |
3、更改后,再次压测,问题修复。
4. 总结
1、引入第三方jar时,核心功能一定要做压力测试,模拟线上真实高并发场景,检查是否存在并发问题或者omm问题;
2、使用第三方jar时,一定参考官方的资料或者demo做开发,切不可轻信网上随意搜索得来的二手资料;
3、oom的现象:jvm内存使用不断上升,且不能被full GC掉;正常情况下jvm内存使用曲线是平缓的锯齿状,而oom的内存使用曲线上升趋势的锯齿状,如下:
线左边为正常状态,线右边为oom时。
4、oom确认手段:jvm内存dump分析:
- 查看内存占用最大的对象,并据此找到泄露点;
- 间隔两个full gc区间各拉一个dump,并比对这个时间段内增加的最多的对象,据此找到泄露点。(可能两次full gc时间拉得较长,也可以退步到一个时间区间的对比)。
*****************************************************************************************
********************* 联系方式:qq:464675856; email: huyangleng3684@sina.com **********************
********** 微信个人账号:mr_daoqi ************ ************* 微信公众号:倒骑的驴 **************
*****************************************************************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了