2011-08-24 139 views
0

上次更新(我找不到任何犯罪行为)后,我的应用程序在1-2小时的工作后开始执行。我异型我的应用程序:一切正常,但过一段时间后,我看到这一点:Java线程问题

热点:

enter image description here

纱线监控器:

enter image description here

什么可以吗?我不知道,因为Tomcat日志不包含错误,我看不到堆栈的操作(只有direct JVM call - 见图片)。此外,我在这个Tomcat上有另一个应用程序,它(另一个应用程序)仍然完美的工作。

任何想法?

+0

你明确自己使用线程池? – djna

+0

只有一个地方我创建线程是通知系统。我在上次更新中同步它。但是,我想,如果我在代码中遇到问题,我会在该代码中看到锁或堆栈。或不? –

回答

2

这是您的HTTP连接器线程池,拥有大量等待线程是非常正常的。

看到这个问题的更多细节:Apache Tomcat Request Threads

你的表格不是很清楚,但它看起来像消耗了88%的应用程序执行时间 - 他们没有使用系统CPU时间的88% - 毕竟,它们正在等待线程。

使用库存设置,实际上有25个等待线程(请参阅链接问题)。超过2小时404秒/ 25似乎并不过分。这大约是每小时8秒的CPU时间。

这很可能是因为你刚刚添加的同步功能有一个并发问题 - 你应该发布一个特定的问题 - 它看起来不像你的问题是与Tomcat或它的线程池,如果另一个应用程序继续运作。


更新

BLOCKED状态,等待/ TIMED_WAITING 状态之间的区别是什么?

当一个线程调用的Object.wait方法,它释放所有获取的 显示器和(如果我们调用wait方法的 超时版本或TIMED_WAITING)状态投入的等待。现在当线程 通过notify()或notifyAll()调用通知相同的对象 然后线程的等待状态结束并且线程开始 试图重新获得它在 时间获得的所有监视器等待电话。有一段时间,可能会有多个线程尝试重新获得(或者第一次获得)他们的显示器。如果超过 一个线程尝试获取特定对象的监视器,则只有一个线程(由JVM调度程序选择)被授予监视器 ,并且所有其他线程都处于BLOCKED状态。有区别?

来源:http://geekexplains.blogspot.com/2008/07/threadstate-in-java-blocked-vs-waiting.html

+0

不一定。根据您编写应用程序的方式,只需让线程处于等待状态很容易。 – Mikaveli

+0

使用像JConsole这样的工具来观察等待的线程,让你知道他们在等什么。 – Mikaveli

+0

你可以使用任何你想要的东西,我说一个像JConsole的工具。如果你很高兴使用JProfiler分析线程堆栈(如果它具有该功能),那就去做吧。 :D – Mikaveli