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

Cha*_*tin 9 java multithreading tomcat quartz-scheduler java-ee

万圣节毕竟.

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

几个子问题:

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

  2. 我发现的关于类似问题的大多数内容都引用了Weblogic; 这是Tomcat的假导演吗?

  3. 有人有一个已知的解决方案吗?

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

更新:它明显增加线程无限制,请参阅jconsole的这个图.

他们已经死了,Jim http://i35.tinypic.com/33vnarn.png

H M*_*les 4

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

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

  • 配置org.quartz.threadPool.threadCount以停止线程耗尽。

更新:

  • 另外,您可能想要进行线程转储并查看线程统计信息。Visual VM有一个名为 TDA 的插件,或者您可以直接使用Thread Dump 分析器

  • 为了以防万一,请检查quartz 版本,看看是否没有已知的错误。