问题背景:12月20日收到某应用服务器cpu使用率报警(99%),于是开始排查原因。
操作步骤如下:
1.首先 使用top命令查找出占用cpu占用率比较高的进程
2.使用 top -Hp pid 命令找出此进程下线程占用cpu情况
注:很平均,并没有发现占用率很高的线程。
3.使用 jstack -F 319843 命令查看线程的堆栈信息
发现好多blocked线程
4.使用命令 jstat -gcutil 319843 查询jvm各个内存区域情况和gc情况
由上图看出eden区100%,survivor区0%,年老代 99.99%, 说明有大对象,导致fullgc频繁,并且回收不掉。导致cpu 99%
5.使用命令jmap -histo 319843 查看类对象占用堆内存信息
找到大对象信息
6.虽然已经定位到出问题的业务,但是为什么会产生大对象呢?
根据日志查询这个业务点,发现由于入参为0,导致查询数据库没有带这个条件,将1000w的数据全部放入内存中
问题解决终于解决了,1分钟改代码,上线解决
总结:个人感觉导致cpu使用率飙高的原因无非2中(如有错误或者遗漏请指正)
1.出现了耗cpu的操作,例如excel的导入和导出,这种情况 找到对应线程即可解决问题
2.各个线程占用cpu比较均衡,这个时候就要考虑是不是频繁gc导致cpu飙高