1. 程式人生 > >記一次排查線上full gc過程

記一次排查線上full gc過程

最近頻繁收到線上報警,就看看到底啥原因


二 匯出dump檔案

2.1 查詢報警對應的程序

ps -ef|grep XX


是23898,看一下gc情況:


這才不到半小時,fgc就增加了好幾次。

jmap匯出dump。

jmap -dump:format=b,file=salary1 23898

因為檔案相對較大,幾百M。直接下載還是比較慢的,所以壓縮後下載是快的。

通常zip,tar壓縮後是原來的1/10.再大的也可以考慮bz2等別的格式。

三 分析dump

3.1 visualVM 

jdk 自帶的,可以去jdk安裝目錄下面直接開啟。


直觀的感受就是例項數裡面,AQS的node節點很多。下面的hashmap,ConcurrentHashMap也是值得關注的。

3.2 MAT

在用mat看看。


     1. Histogram可以列出記憶體中的物件,物件的個數以及大小。
     2. Dominator Tree可以列出那個執行緒,以及執行緒下面的那些物件佔用的空間。
     3.Top consumers通過圖形列出最大的object。
     4.Leak Suspects通過MA自動分析洩漏的原因。

因為是個web工程,所以,顯示web容器是懷疑的物件。


大量的是執行緒池的執行緒。

點進去看Histogram:


丟擲byte[],char[] 還是hashmap佔用的多。

搜一下程式碼看看。

作為一個web工程,典型的MVC應用。


存在大量的json返回介面,都是使用hashmap實現的。

開發的時候省點時間,實際上不推薦的,定義個對應的bean,fastjson 轉成對應的json就好。

效率也比這個好。

2. 在sso程式碼裡面。

 private final Map<Long, String> CITY_NAME = new ConcurrentHashMap<>();

類似這種,讀程式碼後沒有任何併發的情況,卻濫用了ConcurrentHashMap。

業務目的就是根據cityid獲取cityname.放到本地快取或者redis都行。

常見的模式就是:初始化根據sso介面獲取全部城市列表,放到快取,定時去更新就好,畢竟城市調整的機率小(業務發展新增開通城市)。

後續待業務小夥伴優化後看效果,待反饋。