看起来像是
MemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space
是一个常见问题。您可以增加烫发空间的大小,但在重新部署100或200后,它将会满。跟踪ClassLoader内存泄漏几乎是不可能的。
您在生产服务器上使用Tomcat(或另一个简单的servlet容器 - Jetty?)的方法是什么?每次部署解决方案后服务器是否重启?
您是否在许多应用程序中使用一个Tomcat?
也许我应该在不同的端口(或嵌入式Jetty)上使用许多Jetty服务器,并且每次都取消部署/重启/部署?
答案 0 :(得分:6)
我放弃了使用tomcat管理器,现在总是关闭tomcat来重新部署。
我们在同一台服务器上运行两个tomcats,并使用带有mod_proxy_ajp的apache webserver,这样用户就可以通过同一个端口80访问这两个应用程序。这也很好,因为用户在tomcat关闭时会看到apache Service Unavailable页面。
答案 1 :(得分:3)
您可以尝试添加以下Java选项:
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
这将在PermGen空间中启用垃圾收集(默认情况下已禁用),并允许GC卸载类。此外,您应该使用其他地方提到的-XX:PermSize = 64m -XX:MaxPermSize = 128m来增加可用的PermGen数量。
答案 2 :(得分:2)
确实,这是一个问题。我们在Tomcat服务器上运行三个Web应用程序:No.1使用Web应用程序框架,Hibernate和许多其他JAR,没有。 2使用Hibernate和一些JAR而不是。 3基本上是一个非常简单的JSP应用程序。
当我们部署没有。 1,我们总是重启Tomcat。否则,PermGen空间错误很快就会让我们感到困惑。 2号有时可以毫无问题地部署,但是因为它经常在没有问题时发生变化。 1也是如此,无论如何都要安排重启。 3号没有任何问题,可以根据需要经常部署而没有问题。
所以,是的,我们通常会重启Tomcat。但我们也期待Tomcat 7,它应该处理许多内存/类加载器问题,这些问题被埋没到不同的第三方JAR和框架中。
答案 3 :(得分:2)
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
答案 4 :(得分:1)
您应该启用PermGen垃圾回收。默认情况下,Hotspot VM不会收集PermGen垃圾,这意味着所有加载的类文件将永久保留在内存中。每个新部署都会加载一组新的类文件,这意味着您最终会耗尽PermGen空间。
答案 5 :(得分:1)
您使用的是哪个版本的Tomcat? Tomcat 7和6.0.30有许多功能可以避免这些泄漏,或至少警告你他们的原因。
SpringSource的Mark Thomas(以及长期的Tomcat提交者)对此主题的This presentation非常有趣。
答案 6 :(得分:1)
仅供参考,有一个新版本的Plumbr工具,可以监控和检测永久性发电泄漏。