像JVM如果出了问题,就要通过java主进程找到问题线程,再把问题线程通过jstack将堆信息输出出来进行排错,通过以下流程来解决
1.通过top命令找到CPU消耗(%CPU列)最高的进程, 并记住PID
2.通过top -Hp PID 找到CPU消耗(%CPU列)最高的线程, 并记住线程TID
通过printf “%x\n” 十进制线程TID # 将十进制转成十六进制
3.通过jstack PID | grep 十六进制TID -A 30
例如:
找到java主进程
然后top -Hp 11632
如果觉得这里哪个CPU负载高,或者有问题,找出线程的PID,即TID,将其转换为16进制(目的是在JVM中作为关键字做筛选)
这里以11635线程为例
printf “%x\n” 11635
得到2d73
最后通过jstack进行过滤输出(注意jstack后边跟的是进程id不是线程id)
jstack 11632 | grep 2d73 -A 30
如果有输出,即是故障线程的输出,如果没输出,就通过jstack 11632进行排错,可将其重定向出来交由开发排查