记录一次生产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多万条数据,最终导致内存溢出。

猜你喜欢

转载自blog.csdn.net/qiaoxu1989/article/details/131330725