一.dump基本概念java
在故障定位(尤爲是out of memory)和性能分析的時候,常常會用到一些文件來幫助咱們排除代碼問題。這些文件記錄了JVM運行期間的內存佔用、線程執行等狀況,這就是咱們常說的dump文件。經常使用的有heap dump和thread dump(也叫javacore,或java dump)。咱們能夠這麼理解:heap dump記錄內存信息的,thread dump是記錄CPU信息的。linux
heap dump:數據庫
heap dump文件是一個二進制文件,它保存了某一時刻JVM堆中對象使用狀況。HeapDump文件是指定時刻的Java堆棧的快照,是一種鏡像文件。Heap Analyzer工具經過分析HeapDump文件,哪些對象佔用了太多的堆棧空間,來發現致使內存泄露或者可能引發內存泄露的對象。windows
thread dump:瀏覽器
thread dump文件主要保存的是java應用中各線程在某一時刻的運行的位置,即執行到哪個類的哪個方法哪個行上。thread dump是一個文本文件,打開後能夠看到每個線程的執行棧,以stacktrace的方式顯示。經過對thread dump的分析能夠獲得應用是否「卡」在某一點上,即在某一點運行的時間太長,如數據庫查詢,長期得不到響應,最終致使系統崩潰。單個的thread dump文件通常來講是沒有什麼用處的,由於它只是記錄了某一個絕對時間點的狀況。比較有用的是,線程在一個時間段內的執行狀況。eclipse
兩個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分析工具,可以幫咱們快速定位內存泄露問題。