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

 

posted @ 2023-06-13 13:31  learn_cat  阅读(54)  评论(0)    收藏  举报