我在一个Java/J2EE项目中工作,使用JBoss作为应用服务器。
我们使用Jenkins.Sometimes构建我们的war并在服务器上进行热部署,我们在JBoss中得到了一些内存不足的错误。
我想知道这是不是热部署造成的。此外,我想知道热部署是否存在常规手动启动-停止部署的陷阱。
有没有人能提供一些有价值的意见?
发布于 2012-10-27 03:04:03
我同意关于调整堆/permgen空间的答案,尽管如果没有更多关于允许多少内存,您正在使用什么等等的信息,就很难具体说明。
此外,
还想知道热部署是否存在常规手动启动-停止部署的陷阱。
当你在部署之间手动启动和停止服务时,你可能会在清理你的web应用程序时有点草率--而且永远不会有人知道。
热部署时,servlet上下文的前一个实例将被销毁。为了减少OutOfMemory异常的发生频率,您需要确保在发生这种情况时,您可以自行清理。即使您对类加载器PermGen内存问题无能为力,您也不希望通过引入额外的内存泄漏来使问题复杂化。
例如,如果您的war文件启动了任何工作线程,则需要停止这些线程。如果您在JNDI中绑定了一个对象,那么该对象应该是未绑定的。如果有任何打开的文件,数据库连接等,这些都应该关闭。
如果你使用的是像Spring这样的web框架--很多事情都已经解决了。Spring注册了一个ServletContextListener,当servlet上下文被破坏时,它会自动停止容器。但是,您仍然需要确保在init期间创建资源的任何bean将在destroy期间清理这些资源。
如果您正在做一个手工制作的servlet,那么您可能希望在您的web.xml文件中注册ServletContextListener的实现,并在contextDestroyed的实现中清理所有资源。
顺便说一句,你应该在你的答案中包含确切的OutOfMemory异常。如果它显示类似java.lang.OutOfMemoryError: PermGen space的内容,那么可能是类实例的问题,您可以做的并不多。如果是java.lang.OutOfMemoryError: Java heap space,那么可能是应用程序中的内存没有被清理
发布于 2012-10-27 01:57:23
热部署不会清除Perm Gen.中先前加载的Class实例。它会重新加载Class实例。一点谷歌指引我回到了SO What makes hot deployment a "hard problem"?
发布于 2012-10-27 02:12:27
您应该增加堆空间,特别是Perm空间
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-XX:MaxPermSize set maximum Permanent generation size您可以在jboss run.sh或run.bat中的JAVA_OPTS中设置它,如下所示:
-Xms256m -Xmx1024m -XX:MaxPermSize=512m
https://stackoverflow.com/questions/13091915
复制相似问题