首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《作死故障篇三》-如何快速定位死循环

项目发布后,发现机器的cpu飙升,load升高。在排查问题的过程中首先想到的应该是排查一下死锁、死循环。死锁与死循环都会导致cpu飙升(飙升的前提是多个线程都进入了死锁或者死循环,如果是一个线程进入死锁或者死循环状态那么cpu的使用率应该在100%左右)。本文主要讲解如何快速定位死循环,死锁定位原理一样。

案例演示

为了演示死循环,本文使用以后代码作为演示示例:

打包代码、上传至服务器在执行代码之前,首先看一下服务器的资源使用情况,使用top命令,并按1键,资源使用情况如下:

从图中可以看出,该服务器资源为24核,每个核的使用不超过10%接下来执行java命令,启动EndLessLoopDemo程序,命令如下:

执行命令后的再次查看系统资源的使用情况:

从上图中可以看出,EndLessLoopDemo的进程号为15752,cpu使用率一直维持在100.3%,再查看各个核的时候情况,可以很明显的看出其中一个核(上图中的cpu14)的使用率在66.9%,使用率非常高,如果我们只是实现了一个非常简单逻辑的需求,并没有耗cpu资源的操作后,我们应该要意识到,肯定是自己的程序出了问题。

问题排查

为了排查问题,我们应该将该进程的线程栈信息打印出来,查看忙碌的线程在做什么,使用jstack命令

输出结果如下:

从输出结果中我们可以看出,main线程正在执行EndLessLoopDemo类中的第8行代码,而第8行代码就是

因为我们可以去查看该循环的条件是否存在问题,即定位到了死循环的位置。

总结

一个线程的死循环并不会打满一个cpu核,因为是时间片轮转,所以会导致其中某几个cpu核使用率存在明显的上升,但是该进程的cpu使用率肯定是在100%+(排除线程休眠、等待的情况)。如果n个线程执行到死循环语句块中,那么cpu使用率通常会在n*100%左右,因此在简单的逻辑需求中如果出现了cup飙升的情况,应该首先查找程序中是否存在死循环或者死锁(死锁的检测同样是在jstack输出中,查找Dead Lock即可)

常见死循环的案例汇总

while + continue

while + try-catch

因此要慎用while循环,如果该循环是for循环的话没有任何问题,使用while循环时一定要主要细节问题。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180512G0TJJ900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券