僵尸线程吃我的脑子(J2EE,Tomcat,Hibernate,Quartz)

时间:2009-10-30 16:22:00

标签: java tomcat java-ee multithreading quartz-scheduler

毕竟 Hallowe'en。

问题在于:我正在使用Quartz维护一些旧的J2EE代码,其中我的线程已经用完了。 jconsole告诉我,当它呈梨形时,只有不到60K的线程,其中大约100(!!)实际上正在运行。直觉和一些谷歌搜索(参见here)表明正在发生的事情(我认为Quartz)正在创建永远不会被清理的非托管线程。

几个子问题:

  1. 有一个工具,我可以轻松地用来跟踪线程创建,所以我可以肯定这个问题真的是Quartz吗?

  2. 我发现的大多数关于类似问题的内容都参考了Weblogic;这对Tomcat来说是假的吗?

  3. 有没有人知道解决方案?

  4. 自从我做了J2EE以来已经有好几年了,所以如果这是可以简单解决的问题,我不会感到太惊讶。

    更新 :它显然无限制地增加了线程,请参阅jconsole中的这个图。

    They're dead, Jim

2 个答案:

答案 0 :(得分:4)

  • 尝试增加org.quartz.simpl.SimpleThreadPool的日志记录级别以进行调试以获取更多信息。

  • 如果这不起作用,请尝试使用日志记录侦听器。 Quartz有一个JobListener接口,在tutorial中指定。监听器可以帮助您跟踪作业执行情况。也许工作没有完成并陷入僵局。

  • 配置org.quartz.threadPool.threadCount以停止用完线程。

<强>更新

  • 此外,您可能想要进行线程转储并查看线程统计信息。 visual vm有一个名为TDA的插件,或者您可以直接使用Thread dump analyzer

  • 以防万一,检查石英版本,看看是否有已知错误。

答案 1 :(得分:0)

您是否看过jvisualvm - 它提供了更多信息。

此外,获取堆栈跟踪以查看线程实际等待的内容。你可能会有一种感觉。