方法一:jstack命令,java自带排查工具
找进程
# 按 P 排序,找出占用 CPU 最多的 Java 进程 PID(假设是 12345),按Q退出
top
找线程
ps -mp <pid> -o THREAD,tid,time | sort -nr
# 比如 ps -mp 12345 -o THREAD,tid,time | sort -nr
线程TID转换成16进制
printf “%x\n" <tid>
# 比如 printf "%x\n" 6789,执行后输出例如 1a85,注意:不要有 0x 前缀,保持小写。
查看 Java 堆栈,定位对应线程
jstack pid | grep tid
# 比如 jstack 12345 | grep -A 30 1a85
# 怀疑死锁,可使用 jstack 自带的 Found one Java-level deadlock: 关键字