Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生产服务器上的Tomcat、PermGen和重新部署_Java_Tomcat_Out Of Memory_Permgen_Redeploy - Fatal编程技术网

Java 生产服务器上的Tomcat、PermGen和重新部署

Java 生产服务器上的Tomcat、PermGen和重新部署,java,tomcat,out-of-memory,permgen,redeploy,Java,Tomcat,Out Of Memory,Permgen,Redeploy,看起来像 MemoryError: PermGen space java.lang.OutOfMemoryError: PermGen space 这是一个常见的问题。您可以增加烫发空间的大小,但在重新部署100或200次后,烫发空间就满了。跟踪类加载器内存泄漏几乎是不可能的 您在生产服务器上使用Tomcat(或另一个简单的servlet容器-Jetty?)的方法是什么?每次部署后服务器重启是否都是解决方案 您是否在许多应用程序中使用一个Tomcat 也许我应该在不同的端口(或嵌入式Jet

看起来像

 MemoryError: PermGen space
 java.lang.OutOfMemoryError: PermGen space
这是一个常见的问题。您可以增加烫发空间的大小,但在重新部署100或200次后,烫发空间就满了。跟踪类加载器内存泄漏几乎是不可能的

您在生产服务器上使用Tomcat(或另一个简单的servlet容器-Jetty?)的方法是什么?每次部署后服务器重启是否都是解决方案

您是否在许多应用程序中使用一个Tomcat


也许我应该在不同的端口(或嵌入式Jetty)上使用许多Jetty服务器,每次都取消部署/重新启动/部署?

是的,这确实是个问题。我们在Tomcat服务器上运行三个web应用程序:第一个使用web应用程序框架、Hibernate和许多其他JAR,第二个使用Hibernate和一些JAR,第三个基本上是一个非常简单的JSP应用程序

当我们部署no.1时,我们总是重新启动Tomcat。否则PermGen空间错误很快就会影响我们。2号有时可以毫无问题地部署,但由于它经常在1号部署时发生变化,所以无论如何都会安排重新启动。3号完全没有问题,可以根据需要随时部署


所以,是的,我们通常重新启动Tomcat。但我们也期待着Tomcat 7,它应该能够处理许多内存/类装入器问题,这些问题隐藏在不同的第三方JAR和框架中。

我放弃了使用Tomcat管理器,现在总是关闭Tomcat来重新部署


我们在同一台服务器上运行两个Tomcat,并使用带有mod_proxy_ajp的ApacheWebServer,因此用户可以通过相同的端口80访问这两个应用程序。这也很好,因为当tomcat关闭时,用户会看到apache服务不可用页面。

您可以尝试添加以下Java选项:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

这将在PermGen空间中启用垃圾收集(默认情况下关闭),并允许GC卸载类。此外,您应该使用其他地方提到的-XX:PermSize=64m-XX:MaxPermSize=128m来增加可用的PermGen数量。

您应该启用PermGen垃圾收集。默认情况下,Hotspot VM不会收集PermGen垃圾,这意味着所有加载的类文件将永远保留在内存中。每一次新的部署都会加载一组新的类文件,这意味着您最终会耗尽PermGen空间。

热点中的PermGen开关只会延迟问题的出现,最终还是会出现OutOfMemoryError

这个问题已经存在很长时间了,到目前为止,我找到的唯一解决方案是使用JRockit。它没有永久性,所以问题就消失了。我们现在正在测试服务器上对其进行评估,自切换以来,我们还没有遇到过一个PermGen问题。我还尝试在我的本地机器上重新部署了20多次,其中一个应用程序在第一次重新部署时就出现了这个错误,一切都进行得非常顺利

JRockit是为了集成到OpenJDK中,所以这个问题可能在将来的股票Java中也会消失

而且它是免费的,使用与HotSpot相同的许可证:


您使用的是哪个版本的Tomcat?Tomcat 7和6.0.30有许多特性来避免这些泄漏,或者至少警告您它们的原因


SpringSource的Mark Thomas(也是Tomcat的长期提交者)在这个主题上非常有趣。

作为参考,有一个新版本的工具,可以监控和检测永久性的发电泄漏。

这些工具应该有什么帮助?你试过增加堆大小吗?这不是堆大小问题,但是类字节码卸载问题。他们说类不会在JVM中卸载,PermGen空间也不会被清理。正如@Soundlink所指出的,在PermGen中打开GC的参数是“-XX:+CMSClassUnloadingEnabled-XX:+CMSClassWeapingEnabled”。在Ubuntu上,您可以将这些添加到/etc/default/tomcat6中的JAVA_OPTS中。每次重新部署后,您的堆不是都在增长吗?关于堆大小,“JRockit任务控制”显示了什么?据我所知,每次重新部署后,堆的大小都保持不变。我现在再次尝试了大约10次重新部署。这个问题是在2010年提出的。Tomcat 7当时也在计划中。我们的解决方案是关闭tomcat的应用程序,将旧WAR复制到备份目录,从Hudson下载新WAR,启动tomcat。我们使用两个Tomcat和蓝绿色部署模式。我们在HAProxy后面的不同端口上使用两个Tomcat来提供蓝绿色部署解决方案。当“绿色”启动并运行时,“蓝色”服务器关闭,然后HAProxy切换到“绿色”。接下来的部署将转到“蓝色”。