生产服务器上的Tomcat,PermGen并重新部署

看起来像

MemoryError: PermGen space java.lang.OutOfMemoryError: PermGen space 

是一个常见的问题。 您可以增加烫发空间的大小,但在100或200次重新部署后,它将是满的。 跟踪ClassLoader内存泄漏几乎是不可能的。

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

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

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

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

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

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

 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

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

是的,这是一个问题。 我们在Tomcat服务器上运行三个Web应用程序:No.1使用Web应用程序框架,Hibernate和许多其他JAR,没有。 2使用Hibernate和一些JAR而不是。 3基本上是一个非常简单的JSP应用程序。

当我们部署没有。 1,我们总是重启Tomcat。 否则,PermGen空间错误很快就会让我们感到困惑。 2号有时可以毫无问题地部署,但是因为它经常会在没有问题时发生变化。 1也是如此,无论如何都要安排重启。 3号没有任何问题,可以根据需要经常部署而没有问题。

所以,是的,我们通常会重启Tomcat。 但我们也期待Tomcat 7,它应该处理许多内存/类加载器问题,这些问题被埋没到不同的第三方JAR和框架中。

HotSpot中的PermGen开关只能延迟问题,最终无论如何都会得到OutOfMemoryError。

我们已经有这个问题很长时间了,到目前为止我找到的唯一解决方案是使用JRockit。 它没有PermGen,所以问题就消失了。 我们现在正在我们的测试服务器上进行评估,自交换机以来我们没有一个PermGen问题。 我还尝试在我的本地计算机上重新部署超过20次的应用程序,在第一次重新部署时出现此错误,并且所有内容都非常漂亮。

JRockit意味着要集成到OpenJDK中,所以也许这个问题将来也会因Java库存而消失。

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

在与HotSpot相同的许可下,它是免费的:

https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

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

您使用的是哪个版本的Tomcat? Tomcat 7和6.0.30有许多function可以避免这些泄漏,或至少警告你他们的原因。

SpringSource的Mark Thomas(以及长期Tomcat提交者)关于这个主题的演示非常有趣。

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