Java的 jstack堆栈分析
一般情况下, 我们分析一个线程阻塞另外一个线程:
"pool-1-thread-2" #21 prio=5 os_prio=0 tid=0x000000003aded800 nid=0x67a8 waiting for monitor entry [0x000000003d87e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.jstack.JstackThreadUtils.run2(JstackThreadUtils.java:20)
- waiting to lock <0x000000066e50aac0> (a java.lang.String)
at com.example.jstack.LoopMain$2.run(LoopMain.java:25)
docker at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- <0x000000066e67b810> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"pool-1-thread-1" #20 prio=5 os_prio=0 tid=0x000000003adc7000 nid=0x66b8 waiting on condition [0x000000003d77e000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.jstack.JstackThreadUtils.run1(JstackThreadUtils.java:14)
- locked <0x000000066e50aac0> (a java.lang.String)
at com.example.jstack.LoopMain$1.run(LoopMain.java:16)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
持有锁的线程,一般会有 locked xxx 的 文案;
被锁定的线程, 会有文案提示 waiting to lock yyy; 如果 xxx和 yyy的值是相等的, 则 就是锁定和被阻塞的关系。
我们在排查问题的时候,注意发现BLOCKED状态的线程,是否有很多被其他的线程BLOCK住。就通过locked xxx 这种文案。
直接上手搜索的话,还是比较慢的,网上找了找,找到一个分析java的jstack堆栈的工具, 稍微方便了点。 http://ctbots.com
浙公网安备 33010602011771号