永久代问题与电梯和码头
-
12-09-2019 - |
题
我在发展中的标准电梯的平台(家和码头).我重复(一次每隔几天)得到这个:
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
.
你也可以把这些永久性地给您的环境。
为Linux,追加
export
线~/.bashrc
为窗户,新闻
Win-key + PrintScreen
, 和去Advanced > Environment
.也参看 http://support.microsoft.com/kb/310519.
这是因为类的重新加载的如你所说。如果您正在使用大量库等类的总和将迅速成长为每次重新启动。试着用监控您的VisualVM码头例如重装时,得到的内存消耗的概况。
在永久生成是其中JVM把收集等定制类装入的东西,可能不会(垃圾)。
根据您正在部署什么,烫发根设置可以是低的。一些应用程序和/或容器组合做含有一些内存泄漏,所以,当一个应用程序获得未展开有时像类加载器的一些东西不收集,导致填充彼尔姆空间从而产生您有错误。
不幸的是,目前在这种情况下,最好的选择是最大使用以下JVM标志烫发空间(例如用于烫发192米大小):
-XX:MaxPermSize=192M (or 256M)
另一种选择是,以确保任一容器或框架不泄漏内存。