在 Ubuntu 上排查 Java 线程问题,通常分为 定位进程 → 查看线程 → 分析线程栈 → 结合系统资源 几个步骤。下面给你一套实用排查流程(适用于生产环境)。
jps -l
# 或
ps -ef | grep java
记录目标 Java 的 PID(如 12345)。
top -Hp 12345
例如:
PID USER %CPU
12356 app 98%
printf "%x\n" 12356
# 输出:3034
jstack 12345 > jstack.log
或指定用户:
sudo -u app jstack 12345 > jstack.log
在 jstack.log 中搜索:
"thread-name" #xx prio=... tid=0x... nid=0x3034
nid=0x3034 就是刚才的线程RunnableBLOCKEDWAITINGTIMED_WAITINGRunnablewhile / 计算 / 正则 / JSON 解析jstack 12345 | grep -A 20 deadlock
会直接打印死锁信息。
jstack 12345 | grep "java.lang.Thread.State" | sort | uniq -c
常见原因:
ps -eLf | grep 12345
sudo strace -p 12356
jstat -gcutil 12345 1000
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
常用:
thread
thread -n 3 # CPU 最高的 3 个线程
thread --state BLOCKED
./profiler.sh -d 30 -f cpu.html 12345
top -HpjstackHashMap.computeIfAbsentjstackBLOCKED如果你愿意,可以贴:
jstack 片段我可以直接帮你分析是哪类问题。