【问题标题】:Out of memory exceptions Tomcat内存不足异常Tomcat
【发布时间】:2016-05-11 12:48:44
【问题描述】:

我有一个安装了一些应用程序的 Tomcat 7,现在通常会非常快地上传应用程序的新版本:所以我打包战争并取消部署现有的战争并部署新战争或重新部署现有的应用程序,几周后问题来了,当我看到内存几乎已满时,为了防止一些意外的内存不足异常导致我们的客户没有服务

我必须不时重启Tomcat吗? ¿ 这正常吗? Tomcat 零重启是否有实用解决方案?

请专家解答

更新:这个库确实可以帮助避免 permgem 问题和类加载器泄漏: https://github.com/mjiderhamn/classloader-leak-prevention,但请记住,不泄漏是您的责任,没有灵丹妙药。 Visual VM 确实可以帮助检测类加载器泄漏。

【问题讨论】:

  • 我强烈怀疑在您的 Tomcat 上运行的一个/多个应用程序存在可能导致内存泄漏的编码问题。
  • Java 中的热部署可能会很棘手,做错或代码中存在非常微妙的问题可能会导致各种问题。然而,它可以做到。我假设您已经阅读了有关热部署的 tomcat 文档?如果是这样,你最好的办法是在测试服务器上做几次,然后检查堆(我认为是堆内存泄漏?)试图找出发生了什么
  • @Nambary 一些实用的解决方案来发现那个应用程序存在导致内存泄漏的编码问题?
  • Google 有大量关于解决内存泄漏的信息,但只是一个警告:没有简单的解决方案。
  • @Taylor 好吧,我认为需要一些爱因斯坦的解决方案:'尽可能简单而不简单'

标签: java tomcat


【解决方案1】:

Tomcat 零重启的实用解决方案是编写不会泄漏内存的应用程序。就这么简单 - Tomcat 它不太可能自行泄漏内存;) 换句话说:只要您的应用程序发生内存泄漏,重启是不可避免的。您可以调整内存设置,但您只是推迟了不可避免的事情。 Tomcat7 可以检测到一些内存泄漏(甚至可以修复一些简单的泄漏)——如果你安装了 Tomcat 管理器,这个特性就会暴露出来。但是,它并不能帮助您指出泄漏的位置。

从最近的经验来看,我有一个应用程序在正常运行期间似乎没有泄漏,但有一个 PermGen 泄漏 - 这意味着在我尝试做你正在做的事情之前我并没有真正看到泄漏 - 热部署。在填充 PermGen 之前,我只能进行一些部署,因为 Tomcat 无法卸载类的旧实例...... 网上可能对 PermGen 泄漏有更好的解释,但一个快速的谷歌给了我这个:http://cdivilly.wordpress.com/2012/04/23/permgen-memory-leak/

但是,如果您的应用程序在运行一段时间后崩溃,则很可能存在适当的内存泄漏。您可以调整堆大小和垃圾收集设置以尝试补救/解决此问题,但很可能唯一真正的解决方法是追踪泄漏,修复代码并构建不泄漏的版本。 ...但是除非您可以确保每个版本都不会泄漏,否则您需要一个重新启动服务的策略。如果您在发布期间不这样做,请考虑在非高峰时间进行。 如果您有一个集群,您可以考虑使用 memcached 设置 Tomcat 以进行会话复制,以免在重新启动集群中的节点时中断用户。您还可以考虑设置 monit、god、runit、upstart、systemd 等以自动重启失败的服务...

【讨论】:

  • 很好的答案,但只是一个评论:您可以尽力生成不会泄漏的代码,但您无法控制第三方库,例如我发现 XMLBeans 和 JasperReports 的一些泄漏:许多用户抱怨这些泄漏,但目前仍未解决
  • @NestorHernandezLoli 好点 :) ...您可能会争辩说,这些库是您作为应用程序的一部分的责任(也许会找到较旧的非泄漏版本?),尽管我知道这些内容通常如何去。无论如何,重要的是要指出内存泄漏没有神奇的解决方法:)
  • Tomcat 抱怨的大部分泄漏都与未清除的 ThreadLocals 有关,天哪!,我们是 2014 年,他们还没有意识到必须清除 fkn ThreadLocals。顺便提一下,我不认为这些库不好,但这只是一件愚蠢的事情,不应该指望熟练的工程师
  • @NestorHernandezLoli 我非常同意——在你的产品上编码而不是学习如何正确地做事时“节省”的时间很快就花在了调试上。在这种情况下,你最终会让其他人也把时间花在调试上! ...但话又说回来,每个人都会犯错误:)
【解决方案2】:

您需要在 eclipse 中添加最小和最大长度的 VM 参数。在eclipse中转到窗口->首选项->单击Java->单击已安装的JRE。然后双击jre记录添加vm参数为-Xms768m -Xmx1024m。

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多