Java定位问题线程

前言

ps命令的作用是显示进程信息的。
|符号,是个管道符号,表示左右两边两个命令同时执行。
grep命令是查找(Global Regular Expression Print),能使用正则表达式搜索文本,然后把匹配的行显示出来。
命令参数如果前面的参数没有输入值,那么可以多个合并在一起,如-mp等同于-m -p
grep -A -B -C 属于上下文控制(Context control),使用规则如下:
grep -A 显示匹配指定内容及之后的n行
grep -B 显示匹配指定内容及之前的n行
grep -C 显示匹配指定内容及其前后各n行

查看是哪个进程占用了CPU

通过top命令,查看CPU使用率高的进程,看看COMMAND是不是java。

查看这个进程号对应的是哪个java程序

此步骤主要是在服务器部署多个java程序时,查看进程具体的包名,如果服务器只部署了一个jar可以忽略此步骤。

方案1,使用jps显示所有的java应用程序

jps -l

在这里插入图片描述

方案2,使用ps|grep搜索所有的java应用程序

ps -ef|grep java

查看这个进程中哪个线程占用了CPU

方案1,使用pidstat查看线程CPU占用率

pidstat -t -p pid

通过top获取的pid,使用pidstat -t -p pid查询进程下的线程。
在这里插入图片描述

方案2,使用ps查看线程CPU使用时长

ps -mp pid -o THREAD,tid,time

参数含义:
-m显示所有的线程
-p pid进程使用cpu的时间
-o该参数后是用户自定义格式

将这个线程号转16进制(如果是java程序)

将CPU占有率高或CPU使用时间长的线程号转换为16进制(因为后面的jstack里的线程号是16进制),并且将其中的字母转成小写字母。

System.out.println(Integer.toHexString(10003999).toLowerCase());

在jstack中找到这个线程的堆栈信息

使用jstack [进程号] 打印当前的进程堆栈;

jstack 39836

在这里插入图片描述
返回值说明:
prio,表示线程优先级,就是Thread中定义的线程优先级。
os_prio,表示线程在操作系统的优先级。
tid,表示Java内的线程ID,同样在Thread类中。
nid,表示线程在操作系统的线程ID,16进制,我们要的就是这个。

从打印的信息中,找到之前拿到的线程号,看看这个线程在做什么

jstack 39836 | grep tid -A60 #tid为小写的16进制线程ID

可以将CPU占有率高的线程都看一下。
jstack打印的信息可以多关注:Java stack information for the threads listed above:,如果有发现Found 1 deadlock就是死锁导致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值