环境: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为什么不释放内存我就不知道了。