首先來看下堆記憶體的情況:jmap -heap pid

我們可以看到老年代的空間基本都占滿了。
由于可以看到老年代空間基本都滿了,是以可以想到現在程式肯定在瘋狂的進行GC操作,我們執行下指令看看:jstat -gc pid 1000
可以看出fullGC非常頻繁,但是老年代的空間卻并沒減少,應該是發生了記憶體洩漏。
我們導出下dump日志看看,執行:jmap -dump:live,format=b,file=myjmapfile.hprof 31324
這裡我們采用MAT工具去分析dump日志。
打開工具并且導入我們的dump日志。
通過圓餅圖我們可以看到有個線程的記憶體占用率很高,然後裡面顯示的是一個數組對象很大。
接着我們通過柱狀圖更直覺的去看下。
可以看到是這個實體類占的很高。
接着,我們看下線程堆棧資訊。
很明顯,第一個占用最高的和我們前面餅狀圖提示的線程一緻。是以我們點看這個線程詳情看看。
這裡面有很多調用鍊路,但是其實我們隻需要找到我們自己項目的鍊路資訊就行。
果然,我們在這裡找到了和我們前面對象一緻的鍊路資訊。接着我們隻需要找到我們項目上這個檔案的這個方法找到對應的位置就可以大緻定位到洩露發生的地方了。