2

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

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

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

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

4

3 回答 3

1

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

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

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

当您进行热部署时,您的 servlet 上下文的前一个实例将被销毁。为了减少 OutOfMemory 异常的频率,您要确保在发生这种情况时,您自己进行清理。尽管对于类加载器 PermGen 内存问题您无能为力,但您不希望通过引入额外的内存泄漏来使问题复杂化。

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

如果您使用的是像 Spring 这样的 Web 框架 - 其中大部分已经处理好了。Spring 注册了一个 ServletContextListener,它会在 servlet 上下文被销毁时自动停止容器。但是,您仍然需要确保initdestroy.

如果您正在做一个手工制作的 servlet,那么您可能希望在您的 web.xml 文件中注册一个 ServletContextListener 的实现,并在该实现中contextDestroyed清理所有资源。

顺便说一句 - 您应该在答案中包含确切的 OutOfMemory 异常。如果它说类似java.lang.OutOfMemoryError: PermGen space,那么它可能是类实例的问题,您无能为力。如果是,java.lang.OutOfMemoryError: Java heap space那么可能是您的应用程序中的内存没有被清理

于 2012-10-26T19:04:02.887 回答
0

您应该特别增加堆空间 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

于 2012-10-26T18:12:27.447 回答
0

热部署不会清除 Perm Gen 中先前加载的 Class 实例。它会重新加载 Class 实例。一个小小的谷歌让我回到 SO是什么让热部署成为一个“难题”?

于 2012-10-26T17:57:23.430 回答