温馨提示×

ubuntu java线程卡顿怎查

小樊
44
2026-09-10 03:21:08
栏目: 编程语言

在 Ubuntu 上排查 Java 线程卡顿(卡死 / 响应慢),一般按下面思路来,从「先看现象」到「定位线程」再到「分析代码」。


一、先确认是不是 Java 进程卡顿

1. 看 CPU / 负载

top

htop
  • 如果 CPU 很高:可能是死循环、频繁 GC
  • 如果 CPU 很低但卡:可能是死锁、阻塞、等待外部资源

二、找到 Java 进程

jps -l

ps -ef | grep java

记下 PID


三、查看线程级 CPU 占用(最重要)

1. 看进程中哪些线程吃 CPU

top -Hp <PID>

你会看到线程 ID(十进制,如 12345)


2. 转成 16 进制(用于 jstack)

printf "%x\n" 12345

例如输出:3039


四、导出线程栈(核心操作)

jstack <PID> > thread.dump

或(JDK 9+)

jstack -l <PID> > thread.dump

然后在文件里搜索:

nid=0x3039

就能看到 这个线程在干什么


五、常见卡顿原因 & 对应现象

✅ 1. 死锁(Deadlock)

jstack 输出中找:

Found one Java-level deadlock

✅ 2. 阻塞在锁

waiting to lock <0x...>

BLOCKED

✅ 3. 等待外部资源

  • 数据库慢查询
  • Redis / MQ 超时
  • 网络 IO

线程栈里常见:

Socket.read
HttpClient
JDBC

✅ 4. GC 导致卡顿

jstat -gcutil <PID> 1000

如果:

  • FGC 频繁
  • OU 接近 100%

说明 Full GC 卡住线程


六、高级工具(强烈推荐)

✅ Arthas(线上神器)

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

✅ VisualVM / JConsole

  • 图形化
  • 看线程状态、CPU、内存

七、快速排查清单(速查)

✅ top -Hp PID
✅ jstack PID
✅ 找 BLOCKED / WAITING
✅ jstat 看 GC
✅ Arthas thread -b


如果你愿意,可以把:

  • jstack 片段
  • top -Hp 结果
  • 或卡顿场景(Web / MQ / 定时任务)

发出来,我可以帮你 直接定位是哪段代码卡住

0