温馨提示×

ubuntu java线程问题怎查

小樊
37
2026-10-12 22:45:44
栏目: 编程语言

在 Ubuntu 上排查 Java 线程问题(卡死、死锁、CPU 高、线程暴涨等),可以按下面步骤来,从“先看现象”到“深入线程栈”。


一、先确认 Java 进程

jps -l

或

ps -ef | grep java

拿到 PID(如 12345)


二、看整体线程情况(系统层)

1️⃣ 查看进程下所有线程

top -H -p 12345
  • 找到 CPU 占用高的线程 ID(TID)
  • 转换为十六进制:
printf "%x\n" TID

三、看 Java 线程栈(最重要)

✅ 方法 1:jstack(最常用)

jstack 12345 > thread.txt

或

jstack -l 12345

分析内容:

  • java.lang.Thread.State
    • RUNNABLE(可能在死循环)
    • BLOCKED(等锁)
    • WAITING / TIMED_WAITING(正常等待)
  • 死锁:
Found one Java-level deadlock

✅ 方法 2:结合 top + jstack 定位高 CPU 线程

top -H -p 12345

假设 TID = 12456

printf "%x\n" 12456
# 输出 30a8

在 thread.txt 中搜索:

nid=0x30a8

四、死锁 / 阻塞问题

jstack 中典型死锁

"Thread-1" #12 prio=5 os_prio=0 tid=0x00007f... nid=0x30a8 waiting for monitor entry

常见原因

  • synchronized 嵌套
  • 数据库连接未释放
  • 线程池队列满
  • 外部接口超时

五、线程数暴涨

1️⃣ 查看线程数

cat /proc/12345/status | grep Threads

2️⃣ 常见原因

  • 每次请求 new Thread()
  • 线程池配置错误
  • 异步任务未收敛
  • 定时任务重复创建

六、高级工具(推荐)

✅ arthas(强烈推荐)

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

常用命令:

thread
thread -n 3        # CPU 最高的 3 个线程
thread -b          # 阻塞线程
dashboard

✅ VisualVM / JConsole

  • 远程或本地连接
  • 看线程状态、CPU、堆

七、常见排查套路总结

✅ CPU 高
→ top -H + jstack

✅ 卡死
→ jstack 看 BLOCKED / WAITING

✅ 死锁
→ jstack -l

✅ 线程多
→ 看线程池 / 创建点


八、示例问题你可以直接说

你可以直接告诉我:

  • CPU 100%?
  • 服务假死?
  • 线程数一直涨?
  • 用的什么框架(Spring / Tomcat / Netty)?

我可以帮你 精确分析线程栈。

0 踩