Thread Dump线程分析
Thread Dump线程分析
Thread Dump是Java应用在某一时刻的线程快照,用于分析线程状态、死锁和性能问题。
生成Thread Dump
# jstack命令
jstack <pid> > thread_dump.txt
# jcmd命令
jcmd <pid> Thread.print > thread_dump.txt
# 发送信号(Linux)
kill -3 <pid>
# Java代码中生成
ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
线程状态解读
"main" #1 prio=5 tid=0x00007f8b8c001000 java.lang.Thread.State: RUNNABLE
at com.example.service.OrderService.createOrder(OrderService.java:42)
at com.example.controller.OrderController.create(OrderController.java:28)
"worker-1" #12 prio=5 tid=0x00007f8b8c0a2800 java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
"db-connection" #15 prio=5 tid=0x00007f8b8c0a3000 java.lang.Thread.State: BLOCKED
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:231)
- waiting to lock <0x00000007ab5c2a80>
- locked <0x00000007ab5c2b80>
常见线程状态
| 状态 | 含义 | 常见原因 |
|---|---|---|
| RUNNABLE | 正在执行 | CPU密集型操作 |
| BLOCKED | 等待锁 | 锁竞争激烈 |
| WAITING | 无限等待 | wait()/join()/park() |
| TIMED_WAITING | 超时等待 | sleep()/wait(timeout) |
| NEW | 新建 | 线程未启动 |
| TERMINATED | 终止 | 线程执行完毕 |
死锁检测
# jstack自动检测死锁
"Thread-1" waiting to lock <0x00000007ab5c2a80> held by "Thread-2"
"Thread-2" waiting to lock <0x00000007ab5c2b80> held by "Thread-1"
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f8b8c0062b8 (object 0x00000007ab5c2a80),
which is held by "Thread-2"
"Thread-2":
waiting to lock monitor 0x00007f8b8c006548 (object 0x00000007ab5c2b80),
which is held by "Thread-1"
代码中检测死锁
ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
long[] deadlockedThreads = tmx.findDeadlockedThreads();
if (deadlockedThreads != null) {
ThreadInfo[] infos = tmx.getThreadInfo(deadlockedThreads, true, true);
for (ThreadInfo info : infos) {
System.out.println("死锁线程: " + info.getThreadName());
System.out.println(" 持有锁: " + info.getLockedSynchronizers());
System.out.println(" 等待锁: " + info.getLockInfo());
}
}
线程池监控
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
// 监控线程池状态
ScheduledExecutorService monitor = Executors.newScheduledThreadPool(1);
monitor.scheduleAtFixedRate(() -> {
log.info("Active={}, PoolSize={}, Queue={}",
executor.getActiveCount(),
executor.getPoolSize(),
executor.getQueue().size());
}, 0, 5, TimeUnit.SECONDS);
小结
Thread Dump是分析线程问题的基础工具,结合状态分析可快速定位死锁、阻塞和性能瓶颈。