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

时间:2009-08-20 15:44:34

标签: java memory-management jboss permgen

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

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

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

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

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

我最终只是简单地重启Jboss - 没花太多时间。

答案 2 :(得分:0)

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

-XX:+ UseConcMarkSweepGC -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled -XX:MaxPermSize参数=128米

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