1. 程式人生 > >java程式效能分析之thread dump和heap dump

java程式效能分析之thread dump和heap dump

一.dump基本概念

        在故障定位(尤其是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檔案在分析時特別有效,困為它可以看出在先後兩個時間點上,執行緒執行的位置,如果發現先後兩組資料中同一執行緒都執行在同一位置,則說明此處可能有問題,因為程式執行是極快的,如果兩次均在某一點上,說明這一點的耗時是很大的。通過對這兩個檔案進行分析,查出原因,進而解決問題。

二.利用JDK自帶的工具獲取thread dump檔案和heap dump檔案

        使用的JDK工具在JDK_HOME/bin/目錄下,使用到jmap和jstack這兩個命令。

1.獲取heap dump檔案

        windows下切換到JDK_HOME/bin/,執行以下命令:jmap -dump:format=b,file=heap.hprof 2576 

        linux下切換到JDK_HOME/bin/,執行以下命令:./jmap -dump:format=b,file=heap.hprof 2576

        這樣就會在當前目錄下生成heap.hprof檔案,這就是heap dump檔案。

2.獲取thread dump檔案

        windows下執行:jstack 2576 > thread.txt

        linux下執行:./jstack 2576 > thread.txt

        windows/linux則會將命令執行結果轉儲到thread.txt,這就是thread dump檔案。有了dump檔案後,我們就能借助效能分析工具獲取dump檔案中的資訊。

3.如果我們只需要將dump中存活的物件匯出,那麼可以使用:live引數

jmap -dump:live,format=b,file=heapLive.hprof 2576   

        執行完後,我們在當前目錄C:\Java\jdk1.6.0_27\bin下看到剛生成的三個檔案,如下所示:

        說明:如上例項的2576是我當前需要分析的java程序PID,關於Windows下如何獲得指定的JAVA時空程PID可參考:http://bijian1013.iteye.com/blog/2221238

三.使用工具分析java heap dump檔案

        現在我們使用一些圖形化工具,來幫助我們分析檔案中的資訊,有效地定位問題。

1.使用JDK自帶的jhat命令

        jhat是用來分析java堆的命令,可以將堆中的物件以html的形式顯示出來,包括物件的數量,大小等等,並支援物件查詢語言。

jhat -port 5000 heap.hrof

        當服務啟動完成後,我們就可以在瀏覽器中,通過http://localhost:5000/進行訪問,如下所示:

2.使用eclipse MAT工具

        一般來說,應用程式的dump檔案都是很大的,jdk自帶命令難以分析這些大檔案。在實際的生產環境下,我們必須要藉助第三方工具,才能快速開啟這些大檔案,進行分析定位。eclipse memory analyzer是一款優秀的heap分析工具,能夠幫我們快速定位記憶體洩露問題。