java.lang.OutOfMemoryError:Web应用程序使用情况下的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)
我已经增加了最大烫发大小-XX:MaxPermGen=128m
但这只是一个临时解决方案,因为我很确定我们在这里面临一些内存泄漏。 我们的应用程序的Web部分部署在jetty(jsf + icefaces)上。 点击随机组件会增加使用的内存 - 我正在使用jstat -gcold
监视它,几乎所有的命中都意味着3-4kb以上的内存。 我已将-XX:+TraceClassLoading
添加到jvm参数中,并在Web用户界面上执行任何操作时看到许多sun.reflect.GeneratedConstructorAccessor
和sun.reflect.GeneratedMethodAccessor
被记录。 当使用99%的permgen时,我也做了堆转储。 我使用YourKit分析器来分析堆。 在类加载器标签也有loaads sun.reflect.DelegatingClassLoader
与1类为每个行。 什么可能导致记忆不断增长? 任何帮助将非常感激。
在此先感谢卢卡斯
在Sun JVM上,对属性和方法的反射访问最初通过JNI调用到JVM实现中来执行。 如果JVM注意到一个方法或者字段被反射访问了很多,它会产生字节码来做同样的事情 - 一种称之为“通货膨胀”的机制。 这有一个初始速度命中,但之后运行速度快了20倍。 如果你做了很多反思,那就是一个很大的胜利。
该字节码存在于由DelegatingClassLoader实例创建的类中,并占用了permgen空间。 如果问题存在,则可以通过将系统属性sun.reflect.inflationThreshold设置为0(零)来关闭通胀。
首先,这与JSF没有特别的关系。 与您的Web应用程序的需求相比,您只需简单地将应用程序服务器的内存设置得太少。 你会遇到与其他所有框架相同的问题,这些框架在封面下使用了很好的反思(想想所有这些EL解决方案)。 这可以是JSF,Wicket,Spring-MVC,甚至是普通的JSP / Servlet。 这个机会仅限于基于组件的Web框架,这些Web框架严重依赖于EL解析器,比如JSF(和其他)。
此外,众所周知,Tomcat(基于服务器)的服务器可能会导致这种情况,当你(热)重新部署太频繁。 通过以下链接了解它以及如何处理它:
我会建议使用Eclipse MAT,并遵循本教程致力于解决permgen问题。
尽管duffymo注意到你在分析问题方面做得很好,但问题的根源似乎还不得而知。 也许它只是其中的一个组件,一些解析器(正如jwenting所建议的)或类似的。 这个问题并不一定意味着你需要抛弃堆栈中的JSF。
链接地址: http://www.djcxy.com/p/54991.html上一篇: java.lang.OutOfMemoryError: PermGen space on web app usage
下一篇: "java.lang.OutOfMemoryError: PermGen space" in Maven build