最近在项目中,发现一个程序的cpu瞬间会占用100%,经验来说应该是某个方法死循环了或者迭代次数过多。
利用arthas可以查看问题的症结所在。
arthas用户手册
1、首先启动arthas
java -jar arthas-boot.jar
2、找到对应的程序序号
3、输出最繁忙的前3个线程
thread -n 3
例如输出如下格式
可以看出可能有问题的方法是
at com.tsingvast.intelligent.smartbus.service.match.BusShiftMatchNormal.checkOverRest(BusShiftMatchNormal.java:898)
4、针对有问题的方法进行继续查原因,这里用到trace命令
trace com.tsingvast.intelligent.smartbus.service.match.BusShiftMatchNormal checkOverRest
-n 100
5、通过追踪发现这个方法经过一段时间后耗时10s以上,经过仔细查看代码,发现一个bug,在某种情况下存在循环次数过多的情况,甚至是死循环。
6、修改代码,重新发布之后,再查看thread,结果正常
解决问题,OK