Thread Dump是非常有用的診斷Java應用問題的工具,每一個Java虛擬機器都有及時生成顯示所有執行緒在某一點狀態的thread-dump的能力。雖然各個 Java虛擬機器thread dump列印輸出格式上略微有一些不同,但是Thread dumps出來的資訊包含執行緒;執行緒的執行狀態、標識和呼叫的堆疊;呼叫的堆疊包含完整的類名,所執行的方法,如果可能的話還有原始碼的行數。
1. 能在各種作業系統下使用
2. 能在各種下使用
3. 可以在生產環境下使用而不影響系統的效能
4. 可以將問題直接定位到應用程式的程式碼行上
1. 查詢,常見的是程式裡load大量的資料到快取
2. 發現死鎖執行緒
-’\’ (Control-)
kill -QUIT
Kill -3
直接對MSDOS視窗的程式按Ctrl-break
有些Java應用伺服器是在控制檯上執行,如Weblogic,為了方便獲取threaddump資訊,在weblogic啟動的時候,會將其標準輸出重定向到一個檔案,用" ./startWebLogic .sh > log.out &"命令,執行"kill -3 ",Thread dump就會輸出到log.out裡。Tomcat的Thread Dump會輸出到命令列控制檯或者logs的catalina.out檔案裡。為了反映執行緒狀態的動態變化,需要接連做三次以上thread dump,每次間隔10-20s。
在AIX上用IBM的JVM,記憶體溢位時預設地會產生javacore檔案(關於cpu的)和heapdump檔案(關於記憶體的)。
如果沒有,則參照下列方法:
1. 在server啟動前設定下面環境變數(可以加在啟動指令碼中)
export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true
export IBM_HEAPDUMP_OUTOFMEMORY=true
export IBM_HEAPDUMPDIR=
2. 用set命令檢查引數設定,確保沒有設定DISABLE_JAVADUMP,然後啟動server
3. 執行kill -3 命令可以生成javacore檔案和heapdump檔案
在IBM JVM產生的javacore或者Threaddump檔案中
Idle執行緒:一個已經準備好接受請求的執行緒,但是沒有和外掛或者客戶端建立連線
Keep-Alive執行緒:是一個已經準備好接受請求的執行緒,並且已經和外掛或者客戶端建立連線
正在接受請求的執行緒:是一個執行緒正在讀取request的內容或者頭部
對於thread dump資訊,主要關注的是執行緒的狀態和其執行堆疊
執行緒的狀態一般為三類
Runnable(R):當前可以執行的執行緒
Waiting on monitor(CW):執行緒主動wait
Waiting for monitor entry(MW):執行緒等鎖
一般關注的都是第一和第三種狀態的執行緒
Cpu很忙則關注runnable的執行緒
Cpu閒則關注waiting for monitor entry的執行緒
一種典型的死鎖是由於在server端應用(比如servlet)中請求由同一weblogic例項server的資源,解決辦法就是將該servlet放到另外的執行佇列裡去執行 。