我正在使用JAVA 5 (32位)来运行我的应用程序,它在JBoss上运行良好。但是只有在32位系统上才能正常工作。当我们将其部署在64位的java5上时,它会抛出异常。
"java.lang.OutOfMemoryError: PermGen space" exception
是否需要补丁?
是否需要更改代码?
提前感谢。
我正在使用JAVA 5 (32位)来运行我的应用程序,它在JBoss上运行良好。但是只有在32位系统上才能正常工作。当我们将其部署在64位的java5上时,它会抛出异常。
"java.lang.OutOfMemoryError: PermGen space" exception
是否需要补丁?
是否需要更改代码?
提前感谢。
-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位的两倍。由于大多数对象都由指针(对其他对象的引用)组成,因此需要更多的内存来运行。如果您的应用程序需要分配超过4GB的内存,那么您需要运行64位版本,不是吗?如果不需要,最好使用32位JVM。
在启动服务器时,请尝试使用-XX:MaxPermSize=
参数。
-XX:+UseCompressedOops
)。 - Peter Lawrey是否需要补丁?
是的,使用默认使用32位引用的64位Java 6或7。 Java 5.0使用64位引用。 我不认为这将添加到Java 5.0中,因为它已经没有免费支持了近两年(顺便说一句,您可以付费获得支持)。
在Sun / Oracle JVM中,对象对齐为8字节。 JVM利用此事实使用32位引用来寻址32 GB的内存。 (8 * 4G)。 使用直接和内存映射内存,可以使用超过32 GB的内存。
varible name = JAVA_OPTS
variable value = -Xmx1000M -XX:MaxPermSize=512m