最近一個(gè)服務(wù)頻繁的進(jìn)行full gc,而且?guī)着_(tái)同時(shí)gc,且不釋放內(nèi)存,懷疑內(nèi)存泄漏了。于是,決定花時(shí)間好好整理解決一下這個(gè)問(wèn)題。
方案如下:
1、加全局(redis)cache,緩存歷史結(jié)果,減少實(shí)際邏輯執(zhí)行次數(shù);
2、找出“元兇”
以下針對(duì)第二點(diǎn)進(jìn)行說(shuō)明。
一、獲取dump
命令:jcmp [pid] GC.heap_dump
坑:
With the 1.8 release, jstack and jmap (and probably others) have been removed from some java distributions (i.e. the windows distribution still has them, but they are not present on linux distributions).
所以,不能使用jmap了,只好用上面的迂回方法獲取dump文件。
二、分析dump
使用工具:mat, 關(guān)鍵參數(shù):MemoryAnalyzer.ini里面的-Xmx參數(shù)可以根據(jù)dump文件適當(dāng)調(diào)整。
1、首先是load并且分析dump
939d6a15e05430fff9487a7793754c0b.jpg
2、獲取dominator tree
![Uploading 0DF9AF3C-935F-449C-896B-07E5107C3354_728569.png . . .]
3、找出“元兇”:HIDDEN_SYMBOLS_MAP
0DF9AF3C-935F-449C-896B-07E5107C3354.png
4、查看代碼調(diào)用
15560D56-14A0-4D96-B0F9-BF9ADD9E687F.png
總結(jié)
1、java8采用jcmd可以完成很多jmap之前完成的工作
2、mat工具直方圖,dominator tree這些是分析內(nèi)存泄漏的好工具
3、代碼要注意,mutable的靜態(tài)變量,一定要注意是內(nèi)存泄漏的“元兇”
4、最關(guān)鍵的還是業(yè)務(wù)層要熟悉