【问题标题】:tomcat - timer memory leaktomcat - 定时器内存泄漏
【发布时间】:2012-05-23 18:07:55
【问题描述】:

我目前正在使用 tomcat7 。我的 Web 应用程序在停止时导致了 Timer 内存泄漏。 日志是:

   SEVERE: A web application appears to have started a TimerThread     
   named [Timer-5] via the java.util.Timer API but has failed to stop it. 
   To prevent a memory leak, the timer (and hence the associated thread) 
   has been forcibly cancelled.   

我没有在我的网络应用程序中使用 java.util.Timer

【问题讨论】:

  • 进行线程转储。这可能会揭示线程正在做什么以及它可能在哪里启动。

标签: jsp tomcat servlets memory-leaks


【解决方案1】:

这并不一定表明您的代码正在使用java.util.Timer(顺便说一句,这在Java EE webapp 中是一个非常糟糕的主意,原因提到here)。这个Timer 也可以包含在您的webapp 的/WEB-INF/lib 文件夹中提供的任何库中。显然,某些库在 webapp 的启动时自动注册了 ServletContextListenerServletContainerInitializer,其中创建了 Timer

您需要调查它是哪个库,然后相应地修复/删除它。提取 JAR 以检查随附的代码,或将它们一一删除。一旦找到罪魁祸首,我肯定会向库的维护人员报告,绝对不建议在 Java EE webapp 中使用Timer,他们必须修复它。

【讨论】:

  • @Balusc 你怎么知道某些库已经自动注册了 ServletContextListener 或 ServletContainerInitializer?
  • @Pidster:通过检查 JAR 中的任何 *.tld/META-INF/services/*web-fragment.xml 文件。或者通过阅读 JAR 文件供应商的文档。
  • 我不是这个意思。 如何判断 OP 的情况就是这种情况 - 上述有限信息中没有证据表明情况就是这种情况。
  • @Pidster:OP 字面意思是“我没有在我的网络应用程序中使用java.util.Timer”。那么它要么是 servletcontainer 本身,要么是沿着 webapp 部署的任何库。看起来合乎逻辑,不是吗?
  • @BalusC 我同意图书馆可能已经启动了它。 JRE 类可能也启动了它。我不同意您的说法“显然某些库已自动注册了 ServletContextListener 或 ServletContainerInitializer”。
【解决方案2】:

这个我不太确定。似乎有一个 RMI 超时计时器,但所有这些都是 Tomcat 的一部分,所以它不应该是泄漏

【讨论】:

    【解决方案3】:

    tomcat wiki 中有一个解释(种类)和指向此bug in commons-pool 的链接。

    定时器停止在 tomcat >6.0.27 中是可选的

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2012-08-06
      • 2013-07-29
      • 2015-06-04
      • 2014-04-03
      相关资源
      最近更新 更多