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