当前位置: 首页 > 后端技术 > Java

死循环导致CPU飙升到100%的排查记录

时间:2023-04-01 14:25:11 Java

后台突然收到运维告警邮件,在线某台负责处理定时任务的服务器CPU飙升到100%,马上放下工作手又开始紧张的检查工作。我在JVM调优之前也写过一篇文章:Java进程消耗CPU过多进程1.确定Java应用进程号使用jps或ps-ef|grepjava命令确定你要分析的应用程序的进程号2.查看Java应用线程CPU使用率使用top-p109023-H命令查看指定进程下线程CPU使用率,分析哪个线程使用率高,其中109023为第一步确定的进程号并从top命令列出的线程信息中,找出占用CPU高的线程,将线程号转换成十六进制形式printf"%x\n"201106得到对应的十六进制311923。查看线程信息和选择一个较高比例的线程的编号(PID)并将PID转换为十六进制。通过jstack109023|grep31192,可以通过这条命令分析出线程的具体信息,然后使用相应的方案解决CPU占用率高的问题。结果最后调查发现是之前有人在定时任务中埋了个坑,导致死循环导致的问题。代码大致如下publicstaticvoidmain(String[]args){intbeginId=1;//1.勾选获取所有需要处理的流量信息ListneedHandlePhoneList=listNeedHandlePhone(beginId);如果(needHandlePhoneList.size()==0){返回;}//2.开始处理while(needHandlePhoneList.size()>0){//执行逻辑...//错误:总数据库中只有3条记录需要处理,检测到3条记录第一次,最后一条记录的id是3,所以这里的beginId是3beginId=needHandlePhoneList.get(needHandlePhoneList.size()-1).getId();//bug:上面查到的beginId是3,如果按照>=3去数据库查询,还是会查到一条记录,所以needHandlePhoneList永远不为空,产生死循环needHandlePhoneList=listNeedHandlePhone(beginId);}}privatestaticListlistNeedHandlePhone(intbeginId){/***select*fromphonewhereid>=#{beginId}orderbyidlimit100**>=exists问题是会产生死循环与外部逻辑合作时。需要改成>*/returninitPhoneList();}如果本文对您有帮助,请给“凌野君”点个赞,谢谢支持