【问题标题】:A web application appears to have started a thread named [22] but has failed to stop it. This is very likely to create a memory leak一个 Web 应用程序似乎启动了一个名为 [22] 的线程,但未能停止它。这很可能造成内存泄漏
【发布时间】:2011-08-19 19:13:13
【问题描述】:

我有一个 Web 应用程序,在后端部署了 Servlet 并通过 tomcat 部署。该应用程序是简单的 java 应用程序。

我在服务器日志中经常看到此错误: 严重:Web 应用程序似乎启动了一个名为 [22] 但未能阻止它。这很有可能 造成内存泄漏。

是否有任何可能导致它的潜在原因?

【问题讨论】:

    标签: java multithreading servlets


    【解决方案1】:

    我会使用visualvm 1.3.2 并查看正在创建哪些线程。请务必添加所有插件。

    如果不是由您的代码完成,您将无法对其进行太多控制。

    您也不知道该消息是否是红鲱鱼。在一段时间内对您的代码进行负载测试并衡量会发生什么。

    【讨论】:

      【解决方案2】:

      我最近遇到了类似的情况,通过以下步骤解决

      1. 我进行了线程转储。 (使用 Kill -QUIT pid)
      2. 找到 Runnable/Thread 类表单转储
      3. 然后我在运行方法中放置了一个调试点并启动了应用程序 调试模式。
      4. 得到了启动我的线程的代码,我观察到它不是 在停止应用程序时停止。
      5. 在 contextDestroyed 方法中引入了停止线程的代码 AppContextListener(这是我的应用程序类,它扩展 ServletContextListener ),因为当我停止时将调用此方法 Tomcat。

      如果你把 Thread 设置为 Dameon Thread 没有帮助,你可以访问explanation

      【讨论】:

        【解决方案3】:

        Tomcat 等待所有应用程序的线程(用户线程而不是守护线程)在它关闭之前停止,我猜在你的情况下,这个特定的线程是一个用户线程,因此 tomcat 产生了这个错误。 我建议你把这个线程改成 daemon(假设这个是你的)

        【讨论】:

          猜你喜欢
          • 2017-12-26
          • 2017-06-09
          • 2017-11-10
          • 2014-09-27
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 2011-05-18
          • 1970-01-01
          相关资源
          最近更新 更多