问题描述
使用 top -p <pid> 命令(<pid>为Java进程的id号)查看Java进程的cpu占用:
该Java进程占用cpu达到92.2%。
使用 top -Hp <pid> 命令(<pid>为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)此处按照cpu排序:
可以看到,有两个线程号为97243,97912的线程占用cpu分别达到了69.2%和22.0%
使用 printf "%x\n" <tid> 命令(tid指线程的id号)将以上10进制的线程号转换为16进制:
转换后的结果分别为17bdb,17e78,由于16进制以0x开头,所以对应的16进制的线程号为0x17bdb和0x17e78。
使用dk自带命令jstack获取此时的线程快照并输入到文件中:
jstack -l <pid> > ./jstack_result.txt 命令(<pid>为Java进程的id号)来获取线程快照结果并输入到指定文件。
查看生成的txt文件,在其中搜索tid为0x17bdb的线程:
可以看到线程号为0x17bdb(10进制线程号97243)对应的是一个"VM Thread"即虚拟机线程,怀疑fullgc导致此线程cpu消耗高。
再看0x17e78线程:
解决办法
找到问题代码,联系这段代码的开发同事处理。