温馨提示×

ubuntu java线程卡住怎么办

小樊
56
2026-09-22 09:18:36
栏目: 编程语言

在 Ubuntu 上遇到 Java 线程卡住(hang / blocked) 的问题,可以按下面思路和步骤来排查与处理。


一、先确认是不是“线程卡住”

常见表现:

  • 服务不响应请求
  • CPU 占用低但业务不往前走
  • 日志停在某一步
  • 线程池满但没报错

二、快速定位线程状态(最关键)

1️⃣ 找到 Java 进程

jps -l
# 或
ps -ef | grep java

记下 PID


2️⃣ 导出线程栈(最重要)

jstack PID > thread.log

或(Java 9+):

jcmd PID Thread.print > thread.log

3️⃣ 看线程状态

在 thread.log 中重点看:

  • BLOCKED
  • WAITING
  • TIMED_WAITING

常见卡点:

  • synchronized 死锁
  • 数据库连接池耗尽
  • 远程调用无超时
  • 锁竞争激烈

三、常见卡住原因 & 解决办法

✅ 1. 死锁(Deadlock)

jstack 会直接提示:

Found one Java-level deadlock

✅ 解决:

  • 避免嵌套锁
  • 统一加锁顺序
  • 使用 ReentrantLock.tryLock(timeout)

✅ 2. 数据库 / 连接池卡住

表现:

  • 线程卡在:
java.net.SocketInputStream.socketRead0

✅ 解决:

  • 设置 JDBC 超时
jdbc:mysql://ip/db?socketTimeout=5000&connectTimeout=3000
  • 设置连接池最大等待时间(HikariCP / Druid)

✅ 3. 外部 HTTP 调用无超时

线程卡在:

HttpURLConnection / OkHttp / RestTemplate

✅ 解决:

  • 设置连接 & 读取超时
  • 使用熔断(Resilience4j / Sentinel)

✅ 4. 线程池满

表现:

  • 大量 WAITING (parking)

✅ 解决:

  • 增大线程池
  • 加拒绝策略
  • 避免同步阻塞任务

✅ 5. 磁盘 / IO 阻塞(Ubuntu 层面)

top
iostat -x 1

✅ 解决:

  • 检查磁盘是否 100%
  • 日志是否狂写

四、辅助排查工具(Ubuntu)

CPU & 线程

top -H -p PID

线程与系统调用

strace -p 线程PID

内存(非直接卡住但有影响)

jmap -heap PID

五、临时恢复手段(应急)

  • 重启服务(最常用)
  • 重启后加监控
  • 限制最大线程数

六、建议长期优化

✅ 所有外部调用必须超时
✅ 使用异步 + 线程池隔离
✅ 定期 jstack 巡检
✅ 接入 Prometheus + Grafana


如果你愿意,可以把:

  • jstack 片段
  • 卡住的线程名
  • 使用的框架(Spring / Netty / Tomcat)

发出来,我可以帮你 精确判断卡在哪里。

0 踩