1、問題發現
Prometheus報警live服務的某個節點Old GC過多,需要排查。
2、問題分析
查看Prometheus,發現這個節點在11點18分到11點28分,僅僅10分鍾內,進行了5次Full GC,根據經驗(這樣說可能有點扯淡),應該是某個特定接口導致的。
3、使用GCViewer分析GC日志
從圖中可以看到,在發生Full GC的時間段內,老年代的使用不到200M,老年代的總大小為760多M。很顯然,這個不是由於內存不夠導致的。
4、查看GC原因
可以看到5次GC的原因都是System.gc()
,說明代碼中調用了方法System.gc()
(當然可能是業務同學自己寫的代碼,也可能是依賴包中的)。
5、在ELK中查看該服務在該時間段內的調用情況
ELK日志顯示可能是導出Excel導致(歷史原因:嚴格來講,線上服務不應該提供這種導出功能,這部分功能正在慢慢向大數據團隊遷移,但是還沒遷移完)
6、查看代碼
根據日志信息查看代碼發現確實是導出Excel操作導致,依賴包中的jxl.read.biff.WorkbookParser
類中,強制使用了方法System.gc()
進行GC。