温馨提示×

ubuntu java线程如何排查

小樊
45
2026-09-19 07:44:45
栏目: 编程语言

在 Ubuntu 上排查 Java 线程问题,通常分为 定位进程 → 查看线程 → 分析线程栈 → 结合系统资源 几个步骤。下面给你一套实用排查流程(适用于生产环境)。


一、确认 Java 进程

jps -l
# 或
ps -ef | grep java

记录目标 Java 的 PID(如 12345)。


二、查看线程总体情况

1️⃣ top 看 CPU / 线程

top -Hp 12345
  • 会显示该进程下所有 线程(LWP)
  • 找出 CPU 占用高的 线程 ID(十进制)

例如:

PID   USER   %CPU
12356 app    98%

三、线程 ID 转 16 进制(用于 jstack)

printf "%x\n" 12356
# 输出:3034

四、导出 Java 线程栈(最重要)

jstack 12345 > jstack.log

或指定用户:

sudo -u app jstack 12345 > jstack.log

jstack.log 中搜索:

"thread-name" #xx prio=... tid=0x... nid=0x3034
  • nid=0x3034 就是刚才的线程
  • 看它卡在:
    • Runnable
    • BLOCKED
    • WAITING
    • TIMED_WAITING

五、常见线程问题定位

✅ CPU 高

  • Runnable
  • while / 计算 / 正则 / JSON 解析

✅ 死锁

jstack 12345 | grep -A 20 deadlock

会直接打印死锁信息。

✅ 线程暴涨

jstack 12345 | grep "java.lang.Thread.State" | sort | uniq -c

常见原因:

  • 线程池配置不合理
  • 异步任务无节制提交
  • 第三方 SDK 内部线程

六、结合系统级工具

1️⃣ 看系统线程

ps -eLf | grep 12345

2️⃣ 看线程系统调用

sudo strace -p 12356

3️⃣ 看内存 / GC(间接影响线程)

jstat -gcutil 12345 1000

七、高级工具(推荐)

✅ Arthas(强烈推荐)

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

常用:

thread
thread -n 3        # CPU 最高的 3 个线程
thread --state BLOCKED

✅ async-profiler(CPU / 锁)

./profiler.sh -d 30 -f cpu.html 12345

八、典型排查案例

案例 1:接口慢

  1. top -Hp
  2. 高 CPU 线程
  3. jstack
  4. 发现卡在 HashMap.computeIfAbsent

案例 2:服务假死

  1. jstack
  2. 大量 BLOCKED
  3. 找到同一把锁

九、快速排查 checklist

  • [ ] jps 找 PID
  • [ ] top -Hp 找线程
  • [ ] printf %x
  • [ ] jstack
  • [ ] 看状态 & 栈
  • [ ] Arthas 验证

如果你愿意,可以贴:

  • Java 版本
  • 现象(CPU 高 / 卡死 / OOM / 线程多)
  • jstack 片段

我可以直接帮你分析是哪类问题。

0