jBoss 4.0.2多次部署相同的WAR会导致jBoss崩溃,因为PermGem /内存不足错误

我开发Web应用程序并且使用jBoss 4.0.2,当我使用eclipse多次重新部署我的WAR时,jBoss会因为内存不足而崩溃。 当我必须将新版本安装到生产环境时,它将消耗生产服务器内存,因此这意味着我必须停止jBoss以防止从客户服务器重新部署内存。 有没有解决这个问题的方法?

基本上没有。 由于JBoss类加载器的工作方式,每个部署都会占用一大块PermGen,即使取消部署应用程序也不会发布。

您可以通过将PermGen内存池大小增加到几百兆(甚至是演出)来缓解症状,这使问题更容易使用。 我还发现减少代码中静态字段的使用(特别是引用大对象的静态字段)可以减少对PermGen的影响。

理想情况下,我不会在生产中使用热部署,而是关闭服务器,替换WAR / EAR,然后重新启动它。

我不确定它是否已链接,但我怀疑它是 – 就实现应用程序分离而言,JBoss不符合J2EE标准,因为它是开箱即用的。

实际上,有一个类装入器,所有类都放在其中,因此无法卸载类,因此您将遇到此问题。 在这方面,您可以将jboss配置为更符合J2EE。

你是否得到了“内存不足”或者你是否经常记忆不足?

我还通过将JProfiler连接到它并使用它来检查内存使用情况来取得进展。

我最终只是一直重启Jboss – 没花太多时间。

试试这个(适用于Sun的Java):

-XX:+ UseConcMarkSweepGC -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled -XX:MaxPermSize = 128m

CMS实际上可以GC永久生成堆(您的类所在的堆)。 设置MaxPermSize是不必要的,但应用程序服务器的默认值很低。