項目中,有個同事寫的JOB,使用到查詢數據庫大量歷史協議數據(大概300W左右),因爲對存放數據的list或map沒有作「用完即時聲明釋放」。java
致使此Jar部署在windows service後,進程的內存資源一直居高不下,並且屢次執行後,JVM內存終於增加超過最大JVM內存設置max=3GB,數據庫
從而致使程序報錯「內存溢出OutOfMemoryException」提示。windows
解決思路以下:jvm
1. 修改代碼中:大數據的list和map的用完以後,增長聲明釋放資源代碼:list.clear()和list =null;測試
2. 修改jvm命令:增長jvm管理GC回收策略的參數,如:-Xmx2048m -XX:MaxGCPauseMillis=100 -XX:+UseParallelOldGC -XX:+UseParallelGC大數據
而後,刪除以前註冊的windows service (寄宿jar的java程序),從新註冊和啓動jar的windows service服務,測試結果發現:spa
此JOB的jvm內存使用就會自動在list和map使用完畢以後,快速回收佔用的內存資源。blog
而且無論屢次運行JOB,也不會提示內存溢出的異常。進程
圖1:修改前,每次執行完JOB,其進程的內存資源一直沒有釋放,以下圖內存
略
圖2:修改後,每次執行完JOB,其進程的內存資源會快速釋放,以下圖