在 CentOS 上排查 Java 日志中的线程死锁,通常可以按下面步骤来做。
常见现象:
jstack 提示 Found one Java-level deadlockps -ef | grep java
# 或
jps -l
jstack -l <pid> > thread_dump.log
grep -A 50 "deadlock" thread_dump.log
或搜索:
Found one Java-level deadlock
"Thread-1":
waiting to lock monitor 0x00007f... (object 0x00000000)
which is held by "Thread-2"
"Thread-2":
waiting to lock monitor 0x00007f... (object 0x00000000)
which is held by "Thread-1"
→ 这说明两个线程互相等待对方持有的锁。
"http-nio-8080-exec-3"
at com.xxx.service.OrderService.lockInventory(OrderService.java:120)
→ 去对应代码看:
synchronizedReentrantLock// 线程A
lock(a); lock(b);
// 线程B
lock(b); lock(a);
✅ 解决:统一加锁顺序
synchronized(lock){
remoteCall(); // 可能阻塞
}
lock.lock();
try {
...
} finally {
lock.unlock(); // 必须有
}
可配合:
SHOW PROCESSLIST;
ThreadMXBean mx = ManagementFactory.getThreadMXBean();
long[] ids = mx.findDeadlockedThreads();
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
thread -b # 直接显示死锁线程
应用卡死
↓
jps 找 PID
↓
jstack -l PID
↓
找 deadlock
↓
看线程栈 → 定位代码
↓
修复锁顺序 / 释放锁 / 缩小锁范围
如果你愿意,可以把 jstack 日志片段 或 相关 Java 代码 发出来,我可以直接帮你分析死锁原因。