Linux jstack命令詳解

Dus發表於2015-07-16

 jstack用於列印出給定的java程式ID或core file或遠端除錯服務的Java堆疊資訊。  

如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支援以下的這種方式:jstack [-l] pid

如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題。

另外,jstack工具還可以附屬到正在執行的java程式中,看到當時執行的java程式的java stack和native stack的資訊, 如果現在執行的java程式呈現hung的狀態,jstack是非常有用的。

需要注意的問題:

l 不同的 JAVA虛機的執行緒 DUMP的建立方法和檔案格式是不一樣的,不同的 JVM版本, dump資訊也有差別。

l 在實際執行中,往往一次 dump的資訊,還不足以確認問題。建議產生三次 dump資訊,如果每次 dump都指向同一個問題,我們才確定問題的典型性。 

2、命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

$jstack [ option ] [server-id@]remote-hostname-or-IP

引數說明:

pid: java應用程式的程式號,一般可以通過jps來獲得;

executable:產生core dump的java可執行程式;

core:列印出的core檔案;

remote-hostname-or-ip:遠端debug伺服器的名稱或IP;

server-id: 唯一id,假如一臺主機上多個遠端debug服務;

 

示例:

$jstack –l 23561

 

執行緒分析:

一般情況下,通過jstack輸出的執行緒資訊主要包括:jvm自身執行緒、使用者執行緒等。其中jvm執行緒會在jvm啟動時就會存在。對於使用者執行緒則是在使用者訪問時才會生成。

l jvm執行緒:

線上程中,有一些 JVM內部的後臺執行緒,來執行譬如垃圾回收,或者低記憶體的檢測等等任務,這些執行緒往往在JVM初始化的時候就存在,如下所示:

 1 "Attach Listener" daemon prio=10 tid=0x0000000052fb8000 nid=0xb8f waiting on condition [0x0000000000000000]
 2 
 3    java.lang.Thread.State: RUNNABLE
 4 
 5  
 6 
 7    Locked ownable synchronizers:
 8 
 9         - None
10 
11 destroyJavaVM" prio=10 tid=0x00002aaac1225800 nid=0x7208 waiting on condition [0x0000000000000000]
12 
13    java.lang.Thread.State: RUNNABLE
14 
15  
16 
17    Locked ownable synchronizers:
18 
19         - None

 

l 使用者級別的執行緒

還有一類執行緒是使用者級別的,它會根據使用者請求的不同而發生變化。該類執行緒的執行情況往往是我們所關注的重點。而且這一部分也是最容易產生死鎖的地方。

 1 "qtp496432309-42" prio=10 tid=0x00002aaaba2a1800 nid=0x7580 waiting on condition [0x00000000425e9000]
 2 
 3    java.lang.Thread.State: TIMED_WAITING (parking)
 4 
 5         at sun.misc.Unsafe.park(Native Method)
 6 
 7         - parking to wait for  <0x0000000788cfb020> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
 8 
 9         at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
10 
11         at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
12 
13         at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:320)
14 
15         at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:479)
16 
17         at java.lang.Thread.run(Thread.java:662)
18 
19  
20 
21    Locked ownable synchronizers:
22 
23         - None

 

從上述的程式碼示例中我們可以看到該使用者執行緒的以下幾類資訊:

Ø 執行緒的狀態:waiting on condition(等待條件發生)

Ø 執行緒的呼叫情況;

Ø 執行緒對資源的鎖定情況;