线程池增加时,Apache Tomcat线程处于WAITING状态

时间:2013-06-06 11:28:13

标签: apache tomcat

我正在尝试分析我从tomcat服务器上获取的线程转储。其中一个线程转储是在正常运行时间几分钟后进行的,并显示大约70个线程池,其中几个处于WAITING状态。我把一个脚本一夜之间打到服务器上,当我在早上再次使用另一个线程转储时。比较两个转储时,我可以看到线程池已从70个线程增加到90个线程。我还可以看到相同的线程在一个转储和另一个转储之间处于WAITING状态,同时添加了20个新线程。这是否表明我的应用程序中存在一些错误或者这种标准行为?我想知道为什么等待的线程没有被重用,而是创建了新的线程。我假设线程从一个转储到另一个转储都没有被重复使用,因为在转储文件中它将它们报告为“等待”,其中<>中的数字从一个转储到另一个转储是一样的,这个假设是正确的吗?

例如,从我的初始线程转储中我看到:

"http-8000-40" - Thread t@74
   java.lang.Thread.State: WAITING
 at java.lang.Object.wait(Native Method)
 - waiting on <4fd24389> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
 at java.lang.Object.wait(Object.java:485)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
 at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
  - None

然后我可以在第二天早上在同一状态的转储中看到相同的线程并等待同一个对象:(我假设这是“&lt;&gt;”中的数字)

"http-8000-40" - Thread t@74
   java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <4fd24389> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
  - None

1 个答案:

答案 0 :(得分:0)

即使在您的webapp代码完成处理请求之后,Tomcat也需要花一些时间来管理线程和其他资源。为了跟上负载,如果没有足够的线程,Tomcat将分配新的线程。

如果您有70个总线程和70个同时请求,那么一切都应该很好。如果一个请求(70)完成(即,客户端已收到所有数据),而另一个请求是在Tomcat完全使用请求处理器线程之前完成的,则将分配另一个线程来处理导致新请求的新请求。大小= 71的线程池。

这种情况可能会发生多次,因为它可能会因为上下文切换,GC暂停等而无法确定,这会干扰服务器上发生的所有事情的准确时间。