代码之家  ›  专栏  ›  技术社区  ›  SoulWanderer

使用tomcat可能存在内存泄漏

  •  3
  • SoulWanderer  · 技术社区  · 14 年前

    我开发了一个webapp,它广泛使用线程。我们需要定期监控一些资源,然后采取行动。

    为了实现这一点,我们开发了 ThreadManager 那包裹着 ScheduledThreadPoolExecutor

    ServletContextListener 适当关闭遗嘱执行人:

     ejecutor.shutdown();
     try
     {
          ejecutor.awaitTermination(10, TimeUnit.SECONDS);
     }
     catch (InterruptedException ie)
     {
         Thread.currentThread().interrupt();
     }
     System.out.println("Llamo al shutdownnow");
     ejecutor.shutdownNow();
     ejecutor = null;
    

    但是,当我们关闭tomcat/unload上下文时,会出现很多错误,比如:

    GRAVE: The web application [/qsys] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak.

    如果我们通过询问活动线程的数量来监视executor,那么在关闭之后,它会不断地说没有更多的活动线程,但是我们会不断地在tomcat上发现相同的错误。

    有什么想法吗?

    提供更多信息 挂起的线程是在 Executor . 所有这些都覆盖了 interrupt()

    System.out.println("Me intentan interrumpir!!");
    run = false;
    super.interrupt();
    

    然后,在 contextDestroyed 我执行前面提到的关机。。。但是中断后的系统甚至没有打印出来!

    ExecuteExistingDelayedTasksAfterShutdownPolicy 设置为false。。。

    1 回复  |  直到 14 年前
        1
  •  0
  •   SoulWanderer    14 年前

    最后,我发现了一些东西:

    每次我使用 ScheduledThreadPoolExecutor 在取消部署/关闭/重新启动时,tomcat未能关闭池线程,从而导致可能的内存泄漏(这应该没有问题,因为tomcat未能关闭线程,但在杀死它们之后,所以没有问题,但客户不允许……),而其他服务器工作正常。。。

    事实上,我创建了一个核心大小为25的ScheduledThreadPoolExecutor,然后关闭它(没有运行或调度),tomcat仍然无法清理池线程。

    所以我的解决办法是使用计时器,而我等待一个补丁。。。(它发生在tomcat6.0和jdk1.5.0\u22上)