java.lang.OutOfMemoryError:Web应用程序使用的PermGen空间

Luk*_*asz 11 java jsf icefaces memory-leaks permgen

我正在努力解决最近出现的outOfMemory 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)
Run Code Online (Sandbox Code Playgroud)

我增加了最大烫发大小,-XX:MaxPermGen=128m但这只是一个临时解决方案,因为我很确定我们在这里面临一些内存泄漏.我们的应用程序的Web部分部署在jetty(jsf + icefaces)上.单击随机组件会增加使用的内存 - 我正在监视它,jstat -gcold几乎每次命中都会增加3-4kb.我已经添加-XX:+TraceClassLoading到jvm params并且看到很多sun.reflect.GeneratedConstructorAccessor并且sun.reflect.GeneratedMethodAccessor在Web用户界面上有任何操作时被记录.当使用99%的permgen时,我也进行了堆转储.我使用YourKit分析器来分析堆.在类加载器选项卡中,有一些sun.reflect.DelegatingClassLoader行,每个行有1个类.什么可能导致记忆不断增长?任何帮助将非常感激.

提前谢谢,卢卡斯

Nat*_*Nat 5

在Sun JVM上,首先通过通过JNI调用JVM实现来执行对属性和方法的反射访问。如果JVM注意到反射经常访问某个方法或字段,它将生成字节码来执行相同的操作-一种称为“通货膨胀”的机制。这具有最初的速度打击,但此后速度提高了约20倍。如果您进行很多思考,那就是一个大胜利。

该字节码存在于由DelegatingClassLoader实例创建的类中,并占用了permgen空间。如果有问题,可以通过将系统属性sun.reflect.inflationThreshold设置为0(零)来关闭充气。


duf*_*ymo 1

首先,感谢您对这个问题进行了如此彻底的调查,并且更好地写出了您的问题。如果每个人都像您一样有才华和优秀的作家,世界(和这个网站)将会变得更加美好。

我想您已经找到了答案:我认为 JSF 及其反射的使用是您的问题。

这就是我像躲避瘟疫一样避开 JSF 的原因之一。

在我看来,JSF 是 Struts 的一个失败的扩展。我认为 HTML/CSS/JavaScript/AJAX UI 的功能与 JSF 一样强大,甚至更强大,而且对我的 JVM 的负担要小得多。UI 调用服务并保持良好状态并与服务器端分离。