系統上線後,程式報出out of memory錯誤。一方面先加大程式運作的記憶體以解燃眉之急,另一方面希望能有個工具能查出記憶體洩露的原因。
通過查閱資料發現了Memory Analyzer這個eclipse插件,下面講下怎麼用。
首先,擷取Heap dump檔案。
有三種方式:
1、設定JVM參數,-XX:+HeapDumpOnOutOfMemoryError,在記憶體溢出的時候就會生成Heap dump檔案
2、使用jmap。(windows可以通過任務管理器檢視pid)
Java5:jmap -heap:format=b <pid>;
Java6:jmap -dump:format=b,file=HeapDump.bin <pid>
3、在本機運作java程式的時候,直接通過Memory Analyzer生成Heap dump檔案。
其次,安裝Memory Analyzer。
現在已經出1.2.1了,下載下傳位址http://www.eclipse.org/mat/downloads.php
也可以通過eclipse install new software ,位址http://download.eclipse.org/mat/1.2/update-site/
安好後就可以開始看問題啦!
進入後,首頁面如下圖所示:
從上圖可以看到它的大部分功能。
1. Histogram可以列出記憶體中的對象,對象的個數以及大小。
2. Dominator Tree可以列出那個線程,以及線程下面的那些對象占用的空間。
3.Top consumers通過圖形列出最大的object。
4.Leak Suspects通過MA自動分析洩漏的原因。
這次重點是看Leak Suspects,點開後就能看到
點 Detial就能看到實際的一些情況,因為我的錯誤比較2,是以到這步就能看到原因,fix it!