一 現象:
頁面卡死,影響時長:約10min
二 排查:
1 收到報警郵件,查看日志報如下log:
Caused by: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: Java heap space
2 查看cpu,發現cpu跑滿了,查看GC的LOG 發現一直在fullGC,頻率評價是每2秒一次,每次停頓時間大約2.5s
3 查看業務日志log:
發現一直在報dubbo調上游接口根據組織批量查詢下面人員信息超時
三 原因:
報表下載導致的
分析過程:下載報表邏輯是根據傳入組織參數:比如某個公司,獲取該公司下的所有子組織,以及全部子組織下的人,查出全量流水和全量人員,然后根據組織參數和時間段參數過濾得到想要的流水寫入excel導出。問題出現在 :獲取該公司下的所有子組織(可能會很多達到幾萬個)以及全部子組織下的人,調上游人事系統接口dubbo超時,方法的棧楨不能及時退出,大量對象引用一直存在,導致對象所占的空間不能及時通過gc回收,不斷積壓,導致內存泄露,頻繁fullGC,stop the world,系統停頓,每次停頓時間大約2.5s,同時cpu飆升跑滿,系統卡死,頁面無反應。
四 改進方案:
1 減少本地緩存,不要過於依賴本地緩存,只可把高頻少量的數據放入本地緩存,無論是跑批還是報表減少對上游依賴,可以只跑增量數據,減少無用數據的跑批
2 查數據增加分頁控制,控制單次觸發不會占用過多內存,就可以增加下載報表並發進行數量
3 報表接入大數據平台,從業務代碼中剝離