我在JBoss上运行的应用程序使用Java5 (32位)。但它只适用于32位。当我们在64位java5上部署它时,它抛出了一个异常
"java.lang.OutOfMemoryError: PermGen space" exception是否需要打补丁?是否需要更改代码代码?
提前谢谢。
发布于 2011-09-12 16:42:34
当我在tomcat或jetty下运行我的web应用程序时,我也遇到了同样的问题。永久生成内存用于加载类,其思想是“类被加载一次并永久加载”。由于我使用了相当多的库和Spring框架,这些内存很快就会被填满,特别是当我多次重新部署web应用程序时,而不需要重新启动servlet容器。
我发现增加最大永久生成是不够的。您还需要允许垃圾收集在运行时删除未使用的类,否则它将被填满并抛出PermGen空间异常。下面是我为servlet容器添加的JVM选项,
-XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled-XX:MaxPermSize用于设置永久生成的最大值。此大小应大于默认大小。
JVM此选项用于允许-XX:+CMSClassUnloadingEnabled在运行时卸载类。默认情况下,类卸载是禁用的。对于Java5,请阅读this。
为了使类上载选项起作用,还必须设置此选项(ref),则为-XX:+UseConcMarkSweepGC
另外,您应该考虑升级您的JVM版本。Java 5太旧了。
发布于 2011-09-12 13:44:21
64位Java的指针长度是32位的两倍。由于您的大多数对象都是由指针(对其他对象的引用)组成的,因此需要更多的内存才能运行。您运行64位版本是因为您的应用程序首先需要分配超过4 4GB的空间,不是吗?如果不这样做,您最好使用32位JVM。
在启动服务器时使用-XX:MaxPermSize=。
发布于 2011-09-12 14:50:20
是否需要任何补丁?
是的,使用64位Java6或7,默认情况下使用32位引用。Java 5.0使用64位引用。我不认为这会被添加到Java5.0中,因为近两年来它还没有得到免费的支持。(您可以通过BTW付费支持它)
在Sun/Oracle JVM中,对象是8字节对齐的。JVM使用这一事实来使用32位引用来寻址32 GB的内存。(8 * 4G)。对于直接内存和内存映射内存,您可以使用超过32 GB的内存。
https://stackoverflow.com/questions/7383658
复制相似问题