IBM heapAnalyzer分析內存泄露

大家在開發J2EE應用時可能經常碰到OOM的問題。出現這種問題的原因就是內存消耗殆盡,創建新的對象時沒有可分配的內存了。爲了找到真正導致OOM的原因,這裏將使用IBM heapAnalyzer工具進行定位。

首先要知道,IBM heapAnalyzer是通過分析OOM後的Java heap dump文件的,通過對dump文件的分析找到內存可能泄露的點。瞭解這個之後,我們首先需要生成dump文件,這裏我可以編寫一個小程序,如:

public class Test {
/**
  * @param args
  */
public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  //10M的PermSize在integer範圍內足夠產生OOM了
  int i = 0;
  while (true) {
   list.add(new String("test"));  }
}

}

運行該程序時設置JVM的堆內存的極限值爲10M(-Xmx10m),並加上-XX:+HeapDumpOnOutOfMemoryError,此參數是幫助生成dump文件,程序啓動後直到拋出OOM異常。異常拋出後,在程序的classpath下會生成以一個以.hprof結尾的文件,如:java_pid4504.hprof,這就是我們需要的dump文件。

dump文件有了,現在我們使用heapAnalyzer對該dump進行分析,首先需要安裝heapAnalyzer,安裝比較簡單,只要下載下來直接解壓即可,我這裏使用的是ha414.jar,要求JDK1.6,設置JAVA_HOME後,通過命令後啓動heapAnalyzer,如:java -jar ha414.jar。

HeapAnalyzer啓動後的界面如下:

HeapAnalyzer啓動後,通過菜單File->Open打開生成的dump文件java_pid4504.hprof。

dump文件加載後,通過菜單Analysis->Tree View展現出來。

通過dump信息分析內存泄漏的對象。主要思路是堆內存佔用比例,比例越大說明堆內存消耗越多。

這個例子很簡單,通過如下圖很快就可定位出內存泄漏的地方。

這裏可以看到java/util/ArrayList對象佔用堆內容最大,達到93%。當然這裏並不是說ArrayList存在問題,而是說ArrayList佔用的堆內存較多,不正常,至於爲啥會不正常,這還依賴於該對象所處的程序塊相關,找到這點問題就解決一大半了。

最後需要在程序中找到使用該對象的地方,再分析程序,確定產生內存泄漏的原因。


轉自:http://www.51testing.com/?uid-412661-action-viewspace-itemid-241471
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章