首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PermGen空间异常

PermGen空间异常
EN

Stack Overflow用户
提问于 2011-09-12 13:31:58
回答 4查看 10.2K关注 0票数 4

我在JBoss上运行的应用程序使用Java5 (32位)。但它只适用于32位。当我们在64位java5上部署它时,它抛出了一个异常

代码语言:javascript
复制
"java.lang.OutOfMemoryError: PermGen space" exception

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

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-12 16:42:34

当我在tomcat或jetty下运行我的web应用程序时,我也遇到了同样的问题。永久生成内存用于加载类,其思想是“类被加载一次并永久加载”。由于我使用了相当多的库和Spring框架,这些内存很快就会被填满,特别是当我多次重新部署web应用程序时,而不需要重新启动servlet容器。

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

代码语言:javascript
复制
-XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

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

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2011-09-12 13:44:21

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

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

票数 3
EN

Stack Overflow用户

发布于 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的内存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7383658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档