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

前端之家收集整理的这篇文章主要介绍了java.lang.OutOfMemoryError:PermGen空间上的Web应用程序使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力与最近出现的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分析器来分析堆.在类加载器选项卡中有一些sun.reflect.DelegatingClassLoader行,每个类有1个类.什么可能导致记忆不断增长?任何帮助将非常感激.

提前致谢,
卢卡斯

解决方法

在Sun JVM上,通过将JNI调用到JVM实现中,首先执行对属性方法的反射访问.如果JVM注意到通过反射访问方法或字段,它将生成字节码来执行相同的操作 – 称为“通货膨胀”的机制.这有一个初始的速度,但之后运行速度提高了20倍.如果你做了很多反思,一个大赢家.

该字节码生成在由DelegatingClassLoader实例创建的类中,并占用了permgen空间.如果这是一个问题,您可以通过将系统属性sun.reflect.inflationThreshold设置为0(零)来关闭通货膨胀.

猜你在找的Java相关文章