1 业务场景
客户突然反应查询接口非常卡,我自己去打开系统看下,发现所有接口都卡,显然这不是一个接口问题,应该是后台除了问题。
2 问题分析
第一时间查看服务器后台监控,发现内存跟cpu突然大幅度飙升显然发生了内存溢出问题
既然是内存溢出,那我们要使用命令 jmap -histo 1|head -20 查看下溢出的内存对象情况。结果如图,我们发现有大量的lcsAdvice对象
根据以往经验这种突然cpu,内存飙升的情况很可能是sql全表查询导致
3 解决办法
既然有可能是全变表查询导致的那么我们分析下内存飙升这段时间内的慢接口请求应该就能知道是哪个方法里发生的。通过分析发现慢接口如下
找到慢接口我们再去接口看下接口哪里有lcsAdvice对象有关的查询,通过分析发现如下一段代码
再分析下这个接口的请求数据发现请求参数没有单带adviceNo,而分析下上面那段代码我们就会发现如果没带adviceNo是会导致全表查询的
找到问题所在我们就好好解决问题了,既然adviceNo是必传的那我们是不是应该加个必传字段校验
4 总结
- sql查询注意必填字段校验,如果没有校验可能会导致全表查询
- 关于内存溢出处理参考内存溢出处理