FullGC排查心得

 

最近線上系統(JDK1.7)出現了屢次FullGC,可是狀況都不同,今天有時間,將FullGC的排查思路以及如何解決記錄下,供你們一塊兒探討。java

場景一:

系統發佈上線以後,裏面收到以下告警信息:apache

內容:計算週期:2019-11-15 00:16:00-18:00,節點:*.*.*.*,FullGC次數:63次(大於閾值:10次),已觸發嚴重告警!

收到上述告警信息以後,第一反應就是代碼新發布的功能有問題;可是因爲當天發佈功能有點多,一時半會沒法定位到是哪一個功能引發的,所以從功能點排查引發FullGC有點難度;服務器

換個角度,既然發生了FullGC,無外乎幾種狀況:jvm

  1. 代碼中顯示調用System.gc();
  2. jvm的堆空間不足
  3. jvm的永久代空間不足

依據上述內容,先按照關鍵字gc()排查代碼,發現代碼中存在一個批量導出的功能,在for循環中每次都有顯示調用,經過功能驗證,發現每次代碼執行到這裏時都會收到告警信息;同時再次排查每次FullGC時jvm堆變換狀況:
spa

 

 

 經過JVM內存使用狀況能夠確認,本次FullGC,PermGen、OldGen回收效率均爲0%,說明雖然觸發了FullGC可是因爲並未到達上述2/3兩種緣由,所以能夠再次確認是因爲代碼中顯示調用System.gc引發的,在把代碼註釋掉以後再次驗證,未出現FllGC狀況;線程

 

場景二:

場景一問題解決以後,過了2天,系統忽然間又發生相似的狀況,再次排查代碼,發現系統中全部gc()關鍵字均沒有了,此時沒法確認問題緣由。日誌

爲了明確該問題的緣由,從服務器上導出gc的詳細日誌excel

2019-11-26T17:04:52.849+0800: 669022.072: [Full GC (System.gc()) 580M->409M(4096M), 1.2260290 s

經過日誌分析,發生FullGC的時候,依然是因爲System.gc()致使的,可是代碼中卻沒有,所以還須要分析全部請求,經過告警信息發現,全部告警均出如今2分鐘以內,所以能夠判定應該是跟某個功能相關,所以按照時間節點過濾這2分鐘內容全部請求,經過對比發現,全部發生異常狀況下均有一個業務請求在執行,經過代碼分析發現這個請求是一個excel導入請求,爲了明確這次fullGC的根本緣由,須要導出javacore(線程快照)code

經過分析快照日誌發現:xml

 

 

 線程中存在System.gc()方法,經過代碼查看,在excel導入過程當中使用了jxl組件,該組件中存在兩個方法

 

 

 

 

 

 上述兩處均存在現實調用System.gc(),雖然有gcDisabled屬性控制,可是經過代碼排查發現未設置該屬性,某人爲false,所以只要使用到上述兩個方法,均會觸發FllGC。

所以建議不要在使用jxl組件,改成poi組件,或者在使用jxl組件時顯示設置gcDisabled屬性便可。

場景三:

該場景跟上述都不同,在系統運行一段時間以後,忽然短期內發生接口出現嚴重超時的狀況,此時經過監控系統查看jvm堆狀況,

 

 

 發現OldGen已經快滿了,於是觸發FullGC,可是定位是因爲什麼觸發GC,仍是花費了一番功夫。

仍是從日誌下手,在出現FullGC的時候,發如今jvm中存在大量

org.apache.xmlbeans.impl.store.Xobj$AttrXobj
org.apache.xmlbeans.impl.store.Xobj$ElementXobj

說明,系統中大機率存在操做poi,所以迅速排查poi關鍵字,逐個方法排查(問題發生已經超過2小時還未定位到到問題,此時內心已是萬分着急,可是再着急也須要平和心態,從已經日誌和現象中逐一查找,不能隨意猜想,此時的任何猜想均會引導你進入另外一個歧途),發如今一個批量導入的場景中,存在以下代碼:

 

 上述代碼的本意是將excel中的全部空行過濾掉,對於一個正常的excel是沒有任何問題,可是若是是這樣的一個excel文件,就可能會出現問題:

 

 經過圖中能夠發現,該excel竟然被創造出了100w行的空行,雖然經過上面的空過濾能夠將這100w行過濾掉,可是不可忽視的是咱們會創造近100w個Row對象,且這些對象在短期內不能被垃圾回收,當程序執行完畢後,因爲對象過大就會觸發FullGC,致使發生Stop World,所以此時當前jvm的其餘服務也會出現大量超時。

所以在處理excel的時候,務必先判斷總行數、總大小,在作明細判斷。

 

經過上述三個FullGC的處理場景,發如今發生FullGC的時候,大機率是跟咱們代碼編寫有關,所以如何可以熟練使用各類java命令、以及日誌分析,對咱們可以快速定位問題是頗有幫助的。

同時此處在跟你們分享一個我的心得:全部問題排查均須要創建在對業務十分熟悉的狀況下,不然將會走不少彎路,所以建議你們不要單純盲目迷戀技術,業務+技術纔是咱們立足的資本。

相關文章
相關標籤/搜索