文章来源:微信公众号:猿天地
平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。
1. 使用top命令查看cpu占用资源较高的PID
当前占用cup100% 的PID为3455。
2. 通过jps找到当前用户下的java程序PID
执行jps -l能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID。
这样就知道是哪一个项目服务存在问题了。知道了对应的服务,在接着后续的分析步骤。
3. 使用 pidstat命令查找问题线程
命令:pidstat -p < PID > 1 3 -u -t
-p:指定进程号
-u:默认的参数,显示各种进程的cup使用统计
-t:显示选择任务的线程的统计信息外的额外信息
4. 找到cpu占用较高的线程TID
通过上图发现是 3467的TID占用cup较大
5. 因为jstack命令输出文件记录的线程ID是16进制。
因此我们先将TID转换为十六进制的表示方式,转换命令:printf "%x " 3467
将3467转为十六进制 d8b,注意是小写,记录下来,后面会使用。
6. 通过jstack -l PID输出当前进程的线程信息
jstack -l PID /temp/test.log
这个命令是把pid的堆栈信息直接打印到/temp/test.log文件里。-l是非必填参数。
也可以直接搜索,命令:jstack PID | grep d8b
使用第二个命令会直接搜索到tid出现的信息,但缺少上下文不好定位。
7. 查找 TID对应的线程(输出的线程id为十六进制)
找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。
找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。
PS:线程的几种状态如下说明:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。