1.Heap Dump
如果你不知道Java裡面的Heap是什麼意思,這篇文章可能就不太適合你閱讀了。
一個Heap Dump是指在某個時刻對一個Java進程所使用的記憶體情況的一次快照。也就是在某個時刻把Java進程的記憶體以某種格式持久化到了磁碟上。Heap Dump的格式有很多種,而且不同的格式包含的資訊也可能不一樣。但總的來說,Heap Dump一般都包含了一個堆中的Java Objects, Class等基本資料。同時,當你在執行一個轉儲操作時,往往會觸發一次GC,所以你轉儲得到的檔案裡包含的資訊通常是有效內容(包含比較少,或沒有垃圾對象了)
我們往往可以在Heap Dump以下基本資料(一項或者多項,與Dump檔案的格式有關):
- 所有的對象資訊
對象的類資訊、欄位資訊、原生值(int, long等)及引用值
- 所有的類資訊
類載入器、類名、超類及靜態欄位
- 記憶體回收的根對象
根對象是指那些可以直接被虛擬機器觸及的對象
- 線程棧及局部變數
包含了轉儲時刻的線程調用棧資訊和棧幀中的局部變數資訊
一個Heap Dump是不包含記憶體配置資訊的,也就是說你無法從中得知是誰建立了這些對象,以及這些對象被建立的地方是哪裡。
但是通過分析對象之間的參考關聯性,往往也能推斷出相關的資訊了。
2.如何擷取Heap Dump檔案
下面介紹一下常用的三種擷取Heap Dump的方式
當OutOfMemoryError發生時
這可是一個相當便捷的參數了,因為當你需要分析Java記憶體使用量情況時,往往是在OOM(OutOfMemoryError)發生時。那麼通過在你的啟動指令碼中,為Java命令添加以下參數,就可以得到一份記憶體資訊了:
Java –Xmx1024m …. -XX:+HeapDumpOnOutOfMemoryError ……
互動式地擷取Heap Dump
說實話,我還沒用過這個方式,但看起來很方便。和上面的方式類似,也是添加一個Java命令選項,然後你就可以通過使用快速鍵Ctrl + Break去擷取當前的記憶體轉儲資訊了。
Java –Xmx1024m …. -XX:+HeapDumpOnCtrlBreak ……
使用工具擷取
這是我常用的方式,通過JDK內建的一些小工具,你可以參考一下http://blog.romebuilder.com/2011/06/393/
這裡主要用到了jps, jmap
通過jps得到Java進程的PID,然後使用jmap轉儲
jmap –dump:format=b,file=heap.bin PID
還有基本的GUI工具也可以達到類似的效果,如jconsol, Eclipse memory analyzer等,大家可以自己去摸索一下,不過以上提到方法也已經能夠滿足大多數的應用情境了吧。
後續文章會說明如何分析得到的Heap Dump檔案.....