我在发展中的标准电梯的平台(家和码头).我重复(一次每隔几天)得到这个:

Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN:  handle failed
java.lang.OutOfMemoryError: PermGen space

这是在我的开发人员环境。这不是一个问题,因为我能保持重启服务器。在部署我不会具有这些问题,所以它不是一个真正的问题。我只是好奇。

我不知道太多关于JVM。我想我正在想的永久生存储器之类的东西班和实习串?我记得是有点混在一起。网存储器模型...

任何原因为什么会这样?是的默认只是疯狂?是这样做的所有辅助的对象卡拉已经创造的用于功能物体和类似FP东西?每次我重新启动码头与新编写代码(每隔几分钟)我想象它的重新加载课程等。但即便如此,它不是许多可以吗?不应该JVM能够处理大量的课程?

欢呼

Joe

有帮助吗?

解决方案

这个职位:

这一例外发生于一个简单的原因:
permgenspace 是哪类的属性,例如方法、字段,注释,并且还有静态的变量,等等。存储在Java VM,但这个空间具有特殊性来没有被清理的垃圾收集器。所以如果你网络应用程序使用,或者创建一个很大的类别(我的思想动态代人的类别),机会是你见过这个问题。这里有一些方案,帮助我摆脱这种例外:

  • -XX:+CMSClassUnloadingEnabled :这种设置使垃圾收集在permgenspace
  • -XX:+CMSPermGenSweepingEnabled :让垃圾收集器,以去除课程从存储器
  • -XX:PermSize=64M -XX:MaxPermSize=128M :提出了内存数量分配给permgenspace

可以这可能会有帮助。

编辑2012年(近3年后):

翁德拉Žižka 评论意见(和我已经更新了答复以上):

JVM1.6.0_27说:请使用:

  • CMSClassUnloadingEnabled (是否类的卸载时启用的使用CMS GC)
  • 在地方 CMSPermGenSweepingEnabled 在未来

看到完整的 热点JVM选择的完整参考 为更.

其他提示

如果你看到这个时运行 mvn jetty:run, 设置 MAVEN_OPTS.

Linux:

export MAVEN_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

为Windows:

set "MAVEN_OPTS=-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

应该是美好的现在。如果不增加 -XX:MaxPermSize.

你也可以把这些永久性地给您的环境。

这是因为类的重新加载的如你所说。如果您正在使用大量库等类的总和将迅速成长为每次重新启动。试着用监控您的VisualVM码头例如重装时,得到的内存消耗的概况。

在永久生成是其中JVM把收集等定制类装入的东西,可能不会(垃圾)。

根据您正在部署什么,烫发根设置可以是低的。一些应用程序和/或容器组合做含有一些内存泄漏,所以,当一个应用程序获得未展开有时像类加载器的一些东西不收集,导致填充彼尔姆空间从而产生您有错误。

不幸的是,目前在这种情况下,最好的选择是最大使用以下JVM标志烫发空间(例如用于烫发192米大小):

-XX:MaxPermSize=192M (or 256M)

另一种选择是,以确保任一容器或框架不泄漏内存。

scroll top