ThreadDump

531968912發表於2016-07-11


 在故障定位(尤其是out of memory)和效能分析的時候,經常會用到一些檔案來幫助我們排除程式碼問題。這些檔案記錄了JVM執行期間的記憶體佔用、執行緒執行等情況,這就是我們常說的dump檔案。常用的有heap dump和thread dump(也叫javacore,或java dump)。我們可以這麼理解:heap dump記錄記憶體資訊的,thread dump是記錄CPU資訊的。

heap dump:

heap dump檔案是一個二進位制檔案,它儲存了某一時刻JVM堆中物件使用情況。HeapDump檔案是指定時刻的Java堆疊的快照,是一種映象檔案。Heap Analyzer工具透過分析HeapDump檔案,哪些物件佔用了太多的堆疊空間,來發現導致記憶體洩露或者可能引起記憶體洩露的物件。

thread dump:

thread dump檔案主要儲存的是java應用中各執行緒在某一時刻的執行的位置,即執行到哪一個類的哪一個方法哪一個行上。thread dump是一個文字檔案,開啟後可以看到每一個執行緒的執行棧,以stacktrace的方式顯示。透過對thread dump的分析可以得到應用是否“卡”在某一點上,即在某一點執行的時間太長,如資料庫查詢,長期得不到響應,最終導致系統崩潰。單個的thread dump檔案一般來說是沒有什麼用處的,因為它只是記錄了某一個絕對時間點的情況。比較有用的是,執行緒在一個時間段內的執行情況。
兩個thread dump檔案在分析時特別有效,困為它可以看出在先後兩個時間點上,執行緒執行的位置,如果發現先後兩組資料中同一執行緒都執行在同一位置,則說明此處可能有問題,因為程式執行是極快的,如果兩次均在某一點上,說明這一點的耗時是很大的。透過對這兩個檔案進行分析,查出原因,進而解決問題。


ThreadDump是非常有用的診斷Java應用問題的工具,每一個Java虛擬機器都有及時生成顯示所有執行緒在某一點狀態的thread-dump的能力。雖然各個 Java虛擬機器thread dump列印輸出格式上略微有一些不同,但是Thread dumps出來的資訊包含執行緒;執行緒的執行狀態、標識和呼叫的堆疊;呼叫的堆疊包含完整的類名,所執行的方法,如果可能的話還有原始碼的行數。


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ThreadDump - 什麼是Thread Dump?

  Thread Dump是非常有用的診斷Java應用問題的工具,每一個Java虛擬機器都有及時生成顯示所有執行緒在某一點狀態的thread-dump的能力。雖然各個 Java虛擬機器thread dump列印輸出格式上略微有一些不同,但是Thread dumps出來的資訊包含執行緒;執行緒的執行狀態、標識和呼叫的堆疊;呼叫的堆疊包含完整的類名,所執行的方法,如果可能的話還有原始碼的行數。

ThreadDump - Thread Dump特點

  1. 能在各種作業系統下使用 

  2. 能在各種下使用 

  3. 可以在生產環境下使用而不影響系統的效能 

  4. 可以將問題直接定位到應用程式的程式碼行上

ThreadDump - Thread Dump能診斷的問題

  1. 查詢,常見的是程式裡load大量的資料到快取 

  2. 發現死鎖執行緒

ThreadDump - SUN JVM 產生ThreadDump


1. Solaris OS

  -’\’ (Control-) 

  kill -QUIT

2. HP-UX/UNIX/Linux

  Kill -3

3.Windows

  直接對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。

ThreadDump - IBM JVM 產生Thread Dump

  在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檔案

ThreadDump - 常見執行緒狀態


IBM JVM常見執行緒狀態

  在IBM JVM產生的javacore或者Threaddump檔案中 

  Idle執行緒:一個已經準備好接受請求的執行緒,但是沒有和外掛或者客戶端建立連線 

  Keep-Alive執行緒:是一個已經準備好接受請求的執行緒,並且已經和外掛或者客戶端建立連線 

  正在接受請求的執行緒:是一個執行緒正在讀取request的內容或者頭部

Sun JVM的常見執行緒狀態

  對於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放到另外的執行佇列裡去執行 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2121808/,如需轉載,請註明出處,否則將追究法律責任。