1. 程式人生 > >記錄Eclipse Memory Analyzer測試記憶體洩漏

記錄Eclipse Memory Analyzer測試記憶體洩漏

一次專案中現場反映有記憶體洩漏,我剛好負責測試這個部分,這裡簡單記錄一下。

1:記憶體洩漏是什麼? 記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。可以瞭解一下Java的GC機制(Garbage Collection,垃圾回收)。

2:怎麼測? 當時我啟動專案服務,然後top 一下,看專案對應的RES是不是一直在漲?

top   |    grep  ***(pid號)  ->   memory.txt

把res的變化情況輸出重定向到memory.txt中

測了確實一直在漲,沒有被回收掉,然後jmap 一下,對JVM的堆進行heap。

jamp   -dump:file = mymemory(自己定義的檔名)   pid(eg:22900)

然後把這個 mymemory檔案放到Eclipse Memory Analyzer中進行分析,file→open heap file ,等著finish就行。

然後出來一個餅圖,深色區域是懷疑有記憶體洩露的地方。這個圖會告訴你整個heap多少記憶體(Total),記憶體洩露的地方佔了多少,吧啦吧啦。

主要有幾個地方需要分析: 1:Histogram 記憶體中的物件,物件個數以及大小 objects 類的物件的數量 Shallowsize 本身佔用記憶體的大小(不包括對其他物件的引用) Retainsize 自己的Shallowsize+從該物件直接/間接訪問到物件的shallowsize

2: dominator-tree 哪個執行緒,以及執行緒下面的哪些物件佔用的空間。

3:Top consumers 通過圖形列出最大的object

4:Leak Suspects 深色區域被懷疑有記憶體洩漏

“…載入的…例項中聚集(消耗空間) ,建議用關鍵字…檢查” Dtails . list objects → with outgoing refrences 看都應用什麼物件 path to GC roots → exclude weak refrennces 過濾掉弱引用