PermGen与Lift和Jetty有关的问题

Joe*_*Joe 41 memory jvm scala lift permanent-generation

我正在开发标准的Lift平台(maven和jetty).我反复(每隔几天一次)得到这个:

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
Run Code Online (Sandbox Code Playgroud)

这是在我的开发环境中.这不是问题,因为我可以继续重启服务器.在部署中我没有遇到这些问题所以这不是一个真正的问题.我只是好奇.

我不太了解JVM.我认为我认为永久代内存适用于类和内部字符串之类的东西是正确的吗?我记得有点混淆了.NET内存模型......

出现这种情况的原因是什么?默认值是否疯狂低?是否与Scala必须为Function对象和类似的FP事物创建的所有辅助对象有关?每当我用新编写的代码(每隔几分钟)重新启动Jetty时,我想它会重新加载类等等.但即便如此,它也不能用很多可以吗?JVM是否应该能够处理大量的类?

干杯

Von*_*onC 44

这篇文章:

发生此异常的原因很简单:
permgenspace就是类的属性,如方法,字段,注释,也静态变量等存储在Java虚拟机,但这个空间具有特殊性,以不被垃圾收集器清洗.因此,如果您的webapp使用或创建了很多类(我正在考虑动态的几代课程),那么您很可能遇到了这个问题.以下是一些帮助我摆脱这种异常的解决方案:

  • -XX:+CMSClassUnloadingEnabled :此设置允许在permgenspace中进行垃圾收集
  • -XX:+CMSPermGenSweepingEnabled :允许垃圾收集器从内存中删除偶数类
  • -XX:PermSize=64M -XX:MaxPermSize=128M :提高分配给permgenspace的内存量

可能这可能会有所帮助.

编辑2012年7月(差不多3年后):

OndraŽižka评论(我已经更新了上面的答案):

JVM 1.6.0_27说:请使用:

  • CMSClassUnloadingEnabled (使用CMS GC时是否启用了类卸载)
  • 代替CMSPermGenSweepingEnabled将来

查看完整的Hotspot JVM选项 - mroe 的完整参考.

  • JVM 1.6.0_27说:将来使用`CMSClassUnloadingEnabled`代替`CMSPermGenSweepingEnabled`. (3认同)

Ond*_*žka 12

如果你在跑步时看到这个 mvn jetty:run,请设置MAVEN_OPTS.

对于Linux:

export MAVEN_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run
Run Code Online (Sandbox Code Playgroud)

对于Windows:

set "MAVEN_OPTS=-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run
Run Code Online (Sandbox Code Playgroud)

现在应该没问题.如果没有,请增加-XX:MaxPermSize.

您也可以将这些永久地放在您的环境中.