工作中一次內存溢出,查到到解決問題記載

由於公司信息安全問題,一些文件、照片無法取出,只能口述一下

介紹一下問題背景:這是一個老項目,和信用卡相關的系統,每天凌晨會有多個定時任務啓動,把文件裏的數據讀取出來,生成待辦任務,或者查詢數據庫相應的數據生成相應的代辦任務,等類似的任務推送給卡商(信用卡處理中心),每天的數據量大概幾萬,如果前幾天數據有擠壓,等服務通了以後就會有幾十萬或者更多的數據產生等待處理;

事發時間:國慶假期;

異常:內存溢出;

處理方式:重啓服務器後,服務正常使用;

後續跟進:一開始沒有宕機文件走了很多彎路走了很多彎路,沒有找到根本原因;只知道某一行代碼那報錯導致的內存溢出,但是那行代碼只是查詢數據庫得到一個list,然後for循環list;數據量並不是很大,創建的對象並沒有被持續持有,不至於導致內存溢出;

最初的解決辦法是一個不是辦法的辦法,去監聽服務如果服務掛了,或者沒有正確的往數據庫指定的某張表寫入數據,則停止服務,再拉起來;但是這個方法治標不治本;

後來拿到dump文件,用IBM HEAPANALYZER 打開發現百分之99的內存都被用來存在MQreceiver對象,通過IBM HEAPANALYZER一層層查看最後發現是XML中配置的transport類中(用來調用SOA上發佈的服務)創建的MQreceiver對象,我們通過debug斷點把整個調用流程走了一遍,並沒有發現什麼異常,後來在另一個項目中(同樣也用到SOA上的服務)也通過debug斷點把流程走了一遍,發現每次soa調用完成時,會調用MQreceiver類裏的close()方法,close方法中就會銷燬MQreceiver對象引用,等垃圾回收的時候就會把MQreceiver對象給回收掉,最終比對了一下MQreceiver對象那個jar包發現老項目中用到jar包版本是1.0版本,新項目用到的jar包是7.0以後的版本,由於1.0版本里並沒有對MQreceiver對象的引用及時的銷燬,導致如果過多的調用SOA服務時就會創建很多個MQreceiver對象,長時間的累積就是OutOfMemory,最後把低版本的和MQ相關的jar包全部換成高版本的MQ jar包問題得到了解決。

問題說的可能比較簡單但是實際上走了很多彎路沒有敘述,本文只是記錄一下這一次遇到的bug,希望對以後有幫助,也希望對各位看官有所幫助,不喜勿噴,多多包涵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章