PermGen空间异常

时间:2011-09-12 05:31:58

标签: java jboss

我在JBoss上运行的应用程序使用JAVA 5(32位)。但它仅适用于32位工作正常。当我们在64位java5上部署它时,它会抛出异常

"java.lang.OutOfMemoryError: PermGen space" exception

是否需要补丁? 是否需要更改代码?

提前致谢。

4 个答案:

答案 0 :(得分:7)

当我在tomcat或jetty下运行我的Web应用程序时,我得到了同样的问题。永久生成内存用于加载类,其思路是“类是一次加载的”。由于我使用了大量的库和Spring框架,因此当我多次重新部署Web应用程序而不重新启动servlet容器时,这个内存很快就会填满。

我发现增加最大永久生成是不够的。您还需要允许垃圾收集在运行时删除未使用的类,否则它将被填满并抛出PermGen空间异常。以下是我为servlet容器添加的JVM选项

-XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

-XX:MaxPermSize用于设置永久生成的最大值。这应该大于默认大小。

-XX:+CMSClassUnloadingEnabled此选项用于允许JVM在运行时卸载该类。默认情况下,禁用类卸载。对于Java 5,请阅读this

-XX:+UseConcMarkSweepGC,为了使班级上传选项有效,还必须设置此选项(ref

此外,您应该考虑升级JVM版本。 Java 5太旧了。

答案 1 :(得分:3)

64位Java的指针长度是32位的两倍。由于大多数对象都是由指针(对其他对象的引用)组成,因此需要更多内存才能运行。您运行的是64位版本,因为您的应用首先需要需要超过4GB,不是吗?如果不这样做,那么使用32位JVM会更好。

启动服务器时使用-XX:MaxPermSize=

答案 2 :(得分:2)

  

是否需要补丁?

是,使用默认使用32位引用的64位Java 6或7。 Java 5.0使用64位引用。我不认为这会被添加到Java 5.0中,因为它近两年来一直没有得到自由支持。 (你可以付钱来支持BTW)

在Sun / Oracle JVM中,对象是8字节对齐的。 JVM使用此事实使用32位引用来寻址32 GB内存。 (8 * 4G)。使用直接和内存映射内存,您可以使用超过32 GB。

答案 3 :(得分:0)

使用以下参数/值创建一个环境变量:

varible name = JAVA_OPTS

variable value = -Xmx1000M -XX:MaxPermSize=512m