在JBoss中进行热部署时出错

时间:2012-10-26 17:52:15

标签: java jboss hotdeploy

我正在使用JBoss作为应用程序服务器的Java / J2EE项目。

我们使用Jenkins构建我们的战争并在服务器中进行热部署。有时,我们在JBoss中遇到了一些Out of Memory错误。

我想知道热部署是否对此负责。此外,想知道热部署是否比正常的手动启停部署有任何缺陷。

有人可以提供一些有价值的意见吗?

3 个答案:

答案 0 :(得分:1)

我同意有关调整堆/ permgen空间的答案,尽管如果没有关于允许的内存量,使用的内容等的更多信息,它很难具体。

  

此外,想知道热部署是否比正常的手动启停部署有任何陷阱。

当您在部署之间手动启动和停止服务时,您可能会对清理Web应用程序感到有点草率 - 而且没有人会知道。

当您进行热部署时,将破坏servlet上下文的上一个实例。为了减少OutOfMemory异常的频率,您需要确保在发生这种情况时,您需要自行清理。即使你没有关于类加载器PermGen内存问题的任何事情,你也不希望通过引入额外的内存泄漏来解决问题。

例如 - 如果war文件启动任何工作线程,则需要停止这些线程。如果在JNDI中绑定对象,则该对象应该是未绑定的。如果有任何打开的文件,数据库连接等,则应关闭这些文件。

如果您正在使用像Spring这样的Web框架 - 其中大部分内容已经得到了解决。 Spring注册了一个ServletContextListener,它在销毁servlet上下文时自动停止容器。但是,您仍然需要确保在init期间创建资源的任何bean都会在destroy期间清理这些资源。

如果您正在使用手工制作的servlet,那么您需要在web.xml文件中注册ServletContextListener的实现,并在contextDestroyed的实现中清理所有资源。

BTW - 您应该在答案中包含确切的OutOfMemory异常。如果它说的是java.lang.OutOfMemoryError: PermGen space,那么它可能是类实例的问题,你可以做的事情并不多。如果它是java.lang.OutOfMemoryError: Java heap space那么可能是你的应用程序中没有被清理的内存

答案 1 :(得分:0)

热部署不会清除以前在Perm Gen中加载的Class实例。它会重新加载Class实例。一个小谷歌指着我回到SO What makes hot deployment a "hard problem"?

答案 2 :(得分:0)

你应该特别增加堆空间特别是Perm Space

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-XX:MaxPermSize   set maximum Permanent generation size

您可以在jboss JAVA_OPTSrun.sh中的run.bat中进行设置,如:

-Xms256m -Xmx1024m -XX:MaxPermSize=512m