0

运行我的应用程序时出现 OutOfMemory: PermGen space 错误。简要说明:

从源代码运行时不会发生该错误,但是当我从部署的 .jnlp 启动器运行时会发生该错误。该错误发生在通过 RMI 从我们公司数据库中检索数据的屏幕中。从源代码和启动器运行都使用相同的 RMI url。从源代码和启动器运行都使用相同的 Java 版本 (6_38)。该应用程序托管在 OC4J 10.1.3 中。当错误发生时,它不仅会杀死我的应用程序,还会杀死 Java 控制台。

正如其他一些问题中所建议的那样,我已将以下选项添加到应用程序服务器控件中的服务器属性中,但无济于事。

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

java控制台中记录的错误是这样的,取自跟踪文件:

Couldn't process record:
java.lang.OutOfMemoryError: PermGen space
    at sun.misc.Unsafe.defineClass(Native Method)
    at sun.reflect.ClassDefiner.defineClass(Unknown Source)
    at sun.reflect.MethodAccessorGenerator$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.reflect.MethodAccessorGenerator.generate(Unknown Source)
    at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(Unknown Source)
    at sun.reflect.ReflectionFactory.newConstructorForSerialization(Unknown Source)
    at java.io.ObjectStreamClass.getSerializableConstructor(Unknown Source)
    at java.io.ObjectStreamClass.access$1500(Unknown Source)
    at java.io.ObjectStreamClass$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.ObjectStreamClass.<init>(Unknown Source)
    at java.io.ObjectStreamClass.lookup(Unknown Source)

我不确定还有哪些其他信息可能会有所帮助,而且我不知道如何继续。欢迎任何指导。

4

2 回答 2

1

如果您在 Web 应用程序中有 ClassLoader/PermGen 泄漏,您可以使用ClassLoader Leak Prevention 库来消除它们。

如果您想自己追踪泄漏,这个博客系列将会有所帮助。

于 2013-12-21T10:30:48.697 回答
0

首先尝试增加您的 perm 大小,因为默认值通常太低(主要用于 64 位 jvm)。

需要的论据是-XX:PermSize-XX:MaxPermSize

通常最大值为 256M 就足够了。

于 2013-10-30T22:12:31.597 回答