处理“java.lang.OutOfMemoryError:PermGen空间”错误

最近我在我的web应用程序中遇到了这个错误:

java.lang.OutOfMemoryError:PermGen空间

它是运行在Tomcat 6和JDK 1.6上的典型Hibernate / JPA + IceFaces / JSF应用程序。 显然这可能会在重新部署应用程序几次后发生。

是什么导致了它,以及为了避免它可以做些什么? 我如何解决这个问题?


解决方案是在Tomcat启动时将这些标志添加到JVM命令行:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

你可以通过关闭tomcat服务,然后进入Tomcat / bin目录并运行tomcat6w.exe。 在“Java”选项卡下,将参数添加到“Java选项”框中。 点击“确定”,然后重新启动服务。

如果出现错误,指定的服务不作为已安装的服务存在,则应运行:

tomcat6w //ES//servicename

其中servicename是在services.msc中查看的服务器的名称

资料来源:orx对Eric的敏捷答案的评论。


你最好试试-XX:MaxPermSize=128M而不是-XX:MaxPermGen=128M

我无法确切地说明这个内存池的使用情况,但它与加载到JVM中的类的数量有关。 (因此,为tomcat启用类卸载可以解决问题。)如果应用程序在运行时生成并编译类,则更可能需要比默认值大的内存池。


应用服务器PermGen在多个部署之后发生的错误很可能是由容器引用到旧应用的类加载器中引起的。 例如,使用自定义日志级别类将引起应用程序服务器的类加载器持有引用。 您可以使用现代(JDK6 +)JVM分析工具(如jmap和jhat)来检测这些类间加载器泄漏,以查看应用程序中继续保留哪些类,并重新设计或消除它们的使用。 常见的嫌疑犯是数据库,记录器和其他基本框架级库。

请参阅Classloader泄漏:令人畏惧的“java.lang.OutOfMemoryError:PermGen空间”异常,尤其是其后续文章。

链接地址: http://www.djcxy.com/p/9363.html

上一篇: Dealing with "java.lang.OutOfMemoryError: PermGen space" error

下一篇: in javascript, manually controlling order of event listeners