说明:曾经遇到过的一个线上实际问题,Demo是经过加工刻意重现,线上调试问题已经开发和运维人员的基本技能,在此备忘记录。
1、找出CPU占用较高的PID
通过top命令,查找出占用CPU较高的PID:3639 。
pid.png
2、找出PID对应的TID
命令:ps -mp 3639 -o THREAD,tid,time | sort –rn 这里可以看出查到的TID对应的是3673。
tid.png
3、将TID转成16进制
命令:printf "%x\n" 3673 转成十六进制为e59。
4、通过jstack命令查出该线程栈信息
命令:jstack 3546|grep e59 -A 100 前面数字是PID,后面红色数据是十六进制的TID。这里也可以通过jstack pid >/home/stack.log导出日志。
stack.png
可以看上面蓝色部分很清晰的标出了可能有问题的代码位置,可以对比源码,我在20行的位置上面用个死循环导致的。
res.png
提示:若不能及时定位问题,可以通过jmap将JVM的dump日志导出,线下分析用。若jstack、jmap不能使用,可以配置一下环境变量或者切到jre的bin目录下使用。
更多可以关注