PermGen区(Permanent Generation space),是JVM内存的永久保存区域,主要是用来存放Class和Meta信息。
IBM和JRockit的VM没有PermGen区,只有SUN的JDK有。因此,PermGen OOM(Out Of Memory)只会发生在SUN的JDK中。
下面列举了一些常见原因,可对照进行分析解决:
1. PermGen区太小
原因:由于现在Java框架大量用到反射、代理等,以及大量的JSP文件,可能造成PermGen区不够使用。
对策:通过调整MaxPermSize参数解决这个问题。另外weblogic 10.3以上,推荐的MaxPermSize在512M以上。
-XX:PermSize=256M -XX:MaxPermSize=512m
2. weblogic自身的原因
原因:由于weblogic自身的原因,如果反复deploy和undeploy应用而未重启JVM的情况下,会有一些类只加载而没有释放,这样就会造成OOM。
对策:重新启动JVM。
3. 自定义回收策略
原因:自定义回收策略中设定了-Xnoclassgc,禁用了class的自动回收。
对策:检查参数设置。
4.其他原因
原因:其他程序自身的原因
对策:(1)使用-verbose:gc参数启用gc日志,借此分析GC。(2)使用一些分析工具,例如Eclipse Memory Analyzer等