← 返回首页

Thread Dump线程分析

📂 java ⏱ 2 min 202 words

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是分析线程问题的基础工具,结合状态分析可快速定位死锁、阻塞和性能瓶颈。