使用tomcat可能发生内存泄漏

时间:2010-09-29 08:16:12

标签: java multithreading tomcat

我开发了一个广泛使用线程的Webbapp。我们需要以固定的时间间隔监控一些资源然后采取行动。

为实现这一目标,我们开发了一个包含一个 ThreadManager的{​​{1}}。我们允许执行者的任何方法,我们只使用这个管理器来确保每个人都使用相同的线程池实例(管理器是一个Singleton ......)

然后,当我们关闭上下文时,我们有ScheduledThreadPoolExecutor负责正确关闭执行程序:

ServletContextListener

但是,当我们关闭tomcat /卸载上下文时,我们会遇到很多错误:

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上找到相同的错误。

有什么想法吗?

更新:提供了更多信息 挂起的线程是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,所以它就像:

interrupt()

然后,在System.out.println("Me intentan interrumpir!!"); run = false; super.interrupt(); 执行已经提到的关闭期间......但是从中断中退出的系统甚至没有打印出来!

执行者将contextDestroyed设置为false ...

仍然保持线程活着......

1 个答案:

答案 0 :(得分:0)

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

我每次使用ScheduledThreadPoolExecutor tomcat都无法关闭undeploy / close / restart上的池化线程,从而导致可能的内存泄漏(应该没问题,因为tomcat无法关闭它们,但之后它会杀死它们,所以没问题,但客户不会允许它......),而其他服务器就像魅力......

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

所以我的解决方案是使用Timer,而我等待补丁...(它发生在tomcat 6.0& jdk 1.5.0_22)