[转]Java CPU 100% 排查技巧

文章来源:微信公众号:猿天地

平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到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\n" 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,已退出的。

posted @ 2019-08-01 22:33  闲人鹤  阅读(333)  评论(0编辑  收藏  举报