2012-03-08 90 views
3

有人可以解釋爲什麼在jstack捕獲的熱點堆棧跟蹤中,我看到一個線程被屏蔽,沒有任何關於鎖定記錄的信息,意思是什麼 阻止它。java stacktrace顯示阻塞的線程,但沒有關於阻塞它的信息

3 "ajp-0.0.0.0-8029-1082" daemon prio=10 tid=0x63721000 nid=0x2cba 
waiting for monitor entry [0x4e619000] 
4 java.lang.Thread.State: BLOCKED (on object monitor) 
5   at java.lang.Class.forName0(Native Method) 
6   at java.lang.Class.forName(Class.java:186) 
7   at com.my.security.SecurityMethodInterceptor$Rule.isAllowed(SecurityMethodInterceptor.java:102) 
8   at com.my.security.SecurityMethodInterceptor.isAllowed(SecurityMethodInterceptor.java:163) 
9   at com.my.security.SecurityMethodInterceptor.invoke(SecurityMethodInterceptor.java:140) 

10日...... 刪除,因爲它是不相關的

回答

1

某處在堆棧中,你已經切斷部分,是一樣的東西:

- waiting to lock <0xa3cd2188> (a java.lang.Object) 

試試這個簡單的應用程序,它有一個線程打印出它將要等待的線程,然後等待一段時間。你可以在kill -3 <pid>(在linux上)獲得它的完整線程轉儲,包括所有的堆棧,包括等待線程的堆棧。

public class TTest { 
    public static void main(String[] args) throws Exception { 
     final Object lock = new Object(); 
     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       System.out.println("Locking on: " + Integer.toString(lock.hashCode(), 16)); 
       synchronized (lock) { 
        System.out.println("Hello, world!"); 
       } 
      } 
     }; 
     synchronized (lock) { 
      thread.start(); 
      Thread.sleep(600 * 1000); 
      System.out.println("bye!"); 
     } 
    } 
} 
+0

希望在其他跟蹤中,您將能夠看到什麼獲得了鎖定0x4e619000 – 2012-03-08 09:28:27

+0

您確定嗎?我認爲這是Thread – 2012-03-08 09:44:33

+0

@HuyLe Erm的地址,哎呀,對吧。將編輯。 – yshavit 2012-03-08 14:30:56