在 Ubuntu 上排查 Java 线程卡顿(卡死 / 响应慢),一般按下面思路来,从「先看现象」到「定位线程」再到「分析代码」。
top
或
htop
jps -l
或
ps -ef | grep java
记下 PID
top -Hp <PID>
你会看到线程 ID(十进制,如 12345)
printf "%x\n" 12345
例如输出:3039
jstack <PID> > thread.dump
或(JDK 9+)
jstack -l <PID> > thread.dump
然后在文件里搜索:
nid=0x3039
就能看到 这个线程在干什么
在 jstack 输出中找:
Found one Java-level deadlock
waiting to lock <0x...>
或
BLOCKED
线程栈里常见:
Socket.read
HttpClient
JDBC
jstat -gcutil <PID> 1000
如果:
FGC 频繁OU 接近 100%说明 Full GC 卡住线程
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
常用命令:
thread # 查看线程
thread -n 3 # 最忙的 3 个线程
thread -b # 找阻塞线程
trace com.xxx.Service method
✅ top -Hp PID
✅ jstack PID
✅ 找 BLOCKED / WAITING
✅ jstat 看 GC
✅ Arthas thread -b
如果你愿意,可以把:
jstack 片段top -Hp 结果发出来,我可以帮你 直接定位是哪段代码卡住。