记一次内存溢出(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为什么不释放内存我就不知道了。

 

记一次内存溢出(PermGen Space)的坑