記錄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 過濾掉弱引用