我在处理最近出现的一个内存溢出PermGen问题时遇到了困难。以下是出现错误时保存的日志片段:
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1872)
at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:720)
at org.apache.felix.framework.ModuleImpl.access$300(ModuleImpl.java:73)
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1733)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
我增加了最大永久代大小-XX:MaxPermGen=128m
,但这只是一个临时解决方案,因为我相信我们面临内存泄漏问题。我们应用程序的Web部分部署在Jetty上(JSF + Icefaces)。单击随机组件会增加使用的内存-我正在使用jstat -gcold
进行监视,几乎每次点击都意味着增加3-4KB。我将-XX:+TraceClassLoading
添加到JVM参数中,并在Web用户界面发生任何操作时看到许多sun.reflect.GeneratedConstructorAccessor
和sun.reflect.GeneratedMethodAccessor
被记录。当永久代使用了99%时,我还进行了堆转储。我使用YourKit分析器来分析堆。在类加载器选项卡中,有许多sun.reflect.DelegatingClassLoader
行,每个行对应一个类。什么可能导致内存不断增长?任何帮助将不胜感激。
提前致谢, Lukasz