PermGen空间exception

我在JBoss上运行的应用程序使用JAVA 5(32位)。 但它仅适用于32位。 当我们在64位java5上部署它时,它会引发exception

"java.lang.OutOfMemoryError: PermGen space" exception 

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

提前致谢。

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

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

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

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

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

-XX:+UseConcMarkSweepGC ,为了使类上传选项起作用,还必须设置此选项( ref )

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

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

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

是否需要补丁?

是,使用默认使用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。

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

 varible name = JAVA_OPTS variable value = -Xmx1000M -XX:MaxPermSize=512m