在 Ubuntu 上遇到 Java 线程卡住(hang / blocked) 的问题,可以按下面思路和步骤来排查与处理。
常见表现:
jps -l
# 或
ps -ef | grep java
记下 PID
jstack PID > thread.log
或(Java 9+):
jcmd PID Thread.print > thread.log
在 thread.log 中重点看:
BLOCKEDWAITINGTIMED_WAITING常见卡点:
synchronized 死锁jstack 会直接提示:
Found one Java-level deadlock
✅ 解决:
ReentrantLock.tryLock(timeout)表现:
java.net.SocketInputStream.socketRead0
✅ 解决:
jdbc:mysql://ip/db?socketTimeout=5000&connectTimeout=3000
线程卡在:
HttpURLConnection / OkHttp / RestTemplate
✅ 解决:
表现:
WAITING (parking)✅ 解决:
top
iostat -x 1
✅ 解决:
top -H -p PID
strace -p 线程PID
jmap -heap PID
✅ 所有外部调用必须超时
✅ 使用异步 + 线程池隔离
✅ 定期 jstack 巡检
✅ 接入 Prometheus + Grafana
如果你愿意,可以把:
jstack 片段发出来,我可以帮你 精确判断卡在哪里。