Java記憶體分析(1) 基本概念說明

來源:互聯網
上載者:User
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檔案..... 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.