java cpu 100%_[转]Java CPU 100% 排查技巧

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

平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。

1. 使用top命令查看cpu占用资源较高的PID

e8c0e952f9600db41746007870b6af52.png

当前占用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:显示选择任务的线程的统计信息外的额外信息

991972e33a3e5a63f5f1697623766264.png

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为十六进制)

找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。

c5eef4b0bc5d20cada947a82f1ae36ab.png

找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。

PS:线程的几种状态如下说明:

NEW,未启动的。不会出现在Dump中。

RUNNABLE,在虚拟机内执行的。

BLOCKED,受阻塞并等待监视器锁。

WATING,无限期等待另一个线程执行特定操作。

TIMED_WATING,有时限的等待另一个线程的特定操作。

TERMINATED,已退出的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值