记一次项目cpu100%情况解决过程

下午14:29分,运维突然告知,某项目CPU100%,赶紧找到运维开始排查问题

一、通过top命令排查出占用线程,发现占用cpu的线程是GC程序

 

见:https://www.cnblogs.com/maohuidong/p/9313729.html

 

二、通过jstat命令查看内存状态,发现full gc达到150多次。此时仍然无法定位问题。

 

三、通过查看异常时间段nginx日志,发现有个接口传的参数异常,日志如下

 

"49.4.43.25" | "www.wqyunpan.com" | "-" | "[11/Jun/2020:14:29:37 +0800]" | "GET /bookQr/qrcode/checkActivation?activation= HTTP/1.1" | "499" | "0" | "0" | "http://www.wqyunpan.com/scratchQr.html?activation=&code=&id=&openId=&state=" | "Mozilla/5.0 (Linux; Android 9.0; VOG-AL10 Build/HUAWEIVOG-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36" | "0.129" | "-" | "127.0.0.1:8080" | "-" | "heheuid=EA00A8C051CFE15E5B6DAB9F029DBD07" | "507" | "49.4.43.25"

 

 

 

/bookQr/qrcode/checkActivation?activation= 这个接口中,activation本该有值的。但是传空了。

记一次项目cpu100%情况解决过程_第1张图片

 

 

 

四、本地模拟了下activation传空的情况,发现确有出现cpu100%的情况。

 

原因是t_qr_userinfo表有800W条数据,符合空值条件的有422W,mybatis尝试把422W 个对象放入内存,所以造成内存吃紧。进而引起full gc次数增加。最后造成的表象是cpu一直100%,此时定位到问题。

 

 

五、解决办法,增加非空判断

 

Assert.isTrue(!StringUtils.isEmpty(activation), MessageFormat.format(ConsHint.ARG_VALIDATION_ERR, "activation"));

 

 

你可能感兴趣的:(其他)