我正在使用JBoss作为应用程序服务器的Java / J2EE项目。
我们使用Jenkins构建我们的战争并在服务器中进行热部署。有时,我们在JBoss中遇到了一些Out of Memory错误。
我想知道热部署是否对此负责。此外,想知道热部署是否比正常的手动启停部署有任何缺陷。
有人可以提供一些有价值的意见吗?
答案 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_OPTS
或run.sh
中的run.bat
中进行设置,如:
-Xms256m -Xmx1024m -XX:MaxPermSize=512m