同样的,写一个死锁代码片段,发布到虚拟机,访问引起死锁的接口。
排查步骤:
- 使用top或者jps定位到项目进程pid;
[root@localhost webapps]# jps
6944 springboot.jar
7124 Jps
- 获取进程pid后直接使用命令:jstack -l 6944,打印线程dump,然后全文搜索deadlock
Found one Java-level deadlock:
=============================
"Thread-8":
waiting to lock monitor 0x00007f9814003be8 (object 0x00000000eabde030, a java.lang.String),
which is held by "Thread-7"
"Thread-7":
waiting to lock monitor 0x00007f9830005458 (object 0x00000000eab2fcc8, a java.lang.String),
which is held by "Thread-8"
Java stack information for the threads listed above:
===================================================
"Thread-8":
at com.daling.util.DeadLock.lambda$deadLock$1(DeadLock.java:36)
- waiting to lock <0x00000000eabde030> (a java.lang.String)
- locked <0x00000000eab2fcc8> (a java.lang.String)
at com.daling.util.DeadLock$$Lambda$514/1061093170.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
"Thread-7":
at com.daling.util.DeadLock.lambda$deadLock$0(DeadLock.java:23)
- waiting to lock <0x00000000eab2fcc8> (a java.lang.String)
- locked <0x00000000eabde030> (a java.lang.String)
at com.daling.util.DeadLock$$Lambda$513/204515734.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
查看上面的dump日志,Thread-8持有0x00000000eab2fcc8锁,等待0x00000000eabde030;Thread-7持有0x00000000eabde030,等待0x00000000eab2fcc8;所以Thread-8和Thread-7发生死锁。最右一行:Found 1 deadlock.
线程dump 文件里,值得关注的线程状态有
死锁, Deadlock(重点关注)
执行中,Runnable
等待资源, Waiting on condition(重点关注)
等待获取监视器, Waiting on monitor entry(重点关注)
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
阻塞, Blocked(重点关注)
停止,Parked