我正在使用 JBoss 作为应用程序服务器的 Java/J2EE 项目。
我们使用 Jenkins 构建我们的战争并在服务器中进行热部署。有时,我们在 JBoss 中遇到一些内存不足的错误。
我想知道热部署是否对此负责。另外,想知道热部署是否比正常的手动启停部署有任何陷阱。
有人可以提供一些有价值的意见吗?
我同意有关调整堆 / permgen 空间的答案,尽管如果没有关于允许多少内存、您正在使用的内容等的更多信息,很难具体说明。
另外,想知道热部署是否比正常的手动启停部署有任何陷阱。
当您在部署之间手动启动和停止服务时,您可能会有点草率地清理您的 Web 应用程序 - 没有人会知道。
当您进行热部署时,您的 servlet 上下文的前一个实例将被销毁。为了减少 OutOfMemory 异常的频率,您要确保在发生这种情况时,您自己进行清理。尽管对于类加载器 PermGen 内存问题您无能为力,但您不希望通过引入额外的内存泄漏来使问题复杂化。
例如 - 如果您的 war 文件启动了任何工作线程,则需要停止这些工作线程。如果在 JNDI 中绑定对象,则该对象应该是未绑定的。如果有任何打开的文件、数据库连接等,这些应该被关闭。
如果您使用的是像 Spring 这样的 Web 框架 - 其中大部分已经处理好了。Spring 注册了一个 ServletContextListener,它会在 servlet 上下文被销毁时自动停止容器。但是,您仍然需要确保init
在destroy
.
如果您正在做一个手工制作的 servlet,那么您可能希望在您的 web.xml 文件中注册一个 ServletContextListener 的实现,并在该实现中contextDestroyed
清理所有资源。
顺便说一句 - 您应该在答案中包含确切的 OutOfMemory 异常。如果它说类似java.lang.OutOfMemoryError: PermGen space
,那么它可能是类实例的问题,您无能为力。如果是,java.lang.OutOfMemoryError: Java heap space
那么可能是您的应用程序中的内存没有被清理
您应该特别增加堆空间 Perm Space
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-XX:MaxPermSize set maximum Permanent generation size
你可以JAVA_OPTS
在你的 jboss中设置它run.sh
或者run.bat
像:
-Xms256m -Xmx1024m -XX:MaxPermSize=512m
热部署不会清除 Perm Gen 中先前加载的 Class 实例。它会重新加载 Class 实例。一个小小的谷歌让我回到 SO是什么让热部署成为一个“难题”?