记录一次生产OOM排查经历

生产发生OOM,查看线上日志发现如下日志

好在之前已经设置过JVM启动参数:-XX:+HeapDumpOnOutOfMemoryError 可以在项目OOM时自动进行dump,方便后续进行分析。

参数配置路径如下:

tomcat/bin 目录下catalina.sh文件。也可以指定dump文件保存路径,我这边没有设置,dump文件默认存储在tomcat/temp目录下

使用mat内存分析工具进行dump分析。

 

进入后按此按钮对对象进行排序,由上到下,对于像Object,String,byte[]等基本类型可以先进行忽略,直到看到业务代码相关的对象

选择数量最大的一个进行如下操作

点击红框内部分查看更多,直到看到业务代码相关部分

 

如下

查看对应位置代码,此处代码判断字符串非空太过随意,导致空字符串绕过校验进入下面的查询sql,最终酿成生产的悲剧。

idNumber和touristName为前端传入字段。前端输入框初始默认传的是null,但是当输入输入条件再进行删除后,此字段前端会传入“”空字符串

这种场景下idNumber不会作为查询条件参与查询,默认就是查询所有数据,这个表有200多万条数据,最终导致内存溢出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值