这一年让我印象深刻的bug --内存溢出

文章讲述了业务中遇到查询接口卡顿的问题,经分析发现是内存溢出,主要由SQL全表查询引起。通过定位慢接口和代码,确认未传入必填参数adviceNo导致全表扫描。最后强调了对必填字段进行校验的重要性以避免类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 业务场景

     客户突然反应查询接口非常卡,我自己去打开系统看下,发现所有接口都卡,显然这不是一个接口问题,应该是后台除了问题。

2 问题分析

     第一时间查看服务器后台监控,发现内存跟cpu突然大幅度飙升显然发生了内存溢出问题
在这里插入图片描述
      既然是内存溢出,那我们要使用命令 jmap -histo 1|head -20 查看下溢出的内存对象情况。结果如图,我们发现有大量的lcsAdvice对象
在这里插入图片描述

      根据以往经验这种突然cpu,内存飙升的情况很可能是sql全表查询导致

3 解决办法

      既然有可能是全变表查询导致的那么我们分析下内存飙升这段时间内的慢接口请求应该就能知道是哪个方法里发生的。通过分析发现慢接口如下在这里插入图片描述
      找到慢接口我们再去接口看下接口哪里有lcsAdvice对象有关的查询,通过分析发现如下一段代码
在这里插入图片描述
      再分析下这个接口的请求数据发现请求参数没有单带adviceNo,而分析下上面那段代码我们就会发现如果没带adviceNo是会导致全表查询的
在这里插入图片描述

      找到问题所在我们就好好解决问题了,既然adviceNo是必传的那我们是不是应该加个必传字段校验

4 总结

  1. sql查询注意必填字段校验,如果没有校验可能会导致全表查询
  2. 关于内存溢出处理参考内存溢出处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值