記一次記憶體溢位(PermGen Space)的坑
阿新 • • 發佈:2019-02-18
環境:JDK1.6
使用技術:URLClassLoader
事件描述:使用URLClassLoader類載入器,實現熱部署。定時任務載入jar包,任務執行300次左右就會報:PermGen Space
分析過程:
1.檢視記憶體使用情況: jmap -heap pid (jdk8以後檢視元空間大小:jstat -gc pid)
2.檢視持久代具體情況:jmap -permstat pid > perm.txt (jdk8以後檢視元空間詳細佔用:jmap -clstats)
3.生成記憶體分析檔案 jmap -dump:format=b,file=dumpFileName.hprof pid (需藉助MAT工具分析)
分析結果:任務完成後,載入在永久代的URLClassLoader類不能被gc。URLClassLoader不被gc,那就說明URLClassLoader熱載入的類中有物件沒有被gc,通過MAT解析dumpFileName.hprof檔案,發現fastJSON(版本1.1.28)的幾個類佔用堆區很大空間不被gc。
元凶:List<SlotResult2> slotResult2=JSON.parseArray(slot_results, SlotResult2.class);
JSON.parseArray(json陣列轉list)這個方法以前沒有用過,將這個方法替換掉歷時兩週的問題完美解決。JSON.parseArray為什麼不釋放記憶體我就不知道了。