1. 程式人生 > >記一次記憶體溢位(PermGen Space)的坑

記一次記憶體溢位(PermGen Space)的坑

環境: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為什麼不釋放記憶體我就不知道了。