了解Apache Tomcat 6.0.26的线程转储

时间:2013-01-22 13:45:55

标签: java multithreading tomcat tomcat6 threadpool

我做了一个观察,我想完全理解它。

首先我定期进行线程转储并创建线程状态的摘要:

jstack -l 19498 > dump.txt ; awk '/State: / { print }' < dump.txt  | sort | uniq -c

上面命令的结果如下所示:

 70    java.lang.Thread.State: RUNNABLE
  8    java.lang.Thread.State: TIMED_WAITING (on object monitor)
  1    java.lang.Thread.State: TIMED_WAITING (sleeping)
171    java.lang.Thread.State: WAITING (on object monitor)

RUNNABLE =实际提供网络应用程序的请求
TIMED_WAITING = Quartz Scheduler线程
WAITING =等待处理即将发生的HTTP请求的空闲线程

WAITING线程的示例(所有WAITING看起来像这样):

"http-80-178" daemon prio=10 tid=0x00007fa8c0bbe000 nid=0x2e11 in Object.wait() [0x00007fa8aaae9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00007fa8e6b873c8> (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)
        - locked <0x00007fa8e6b873c8> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
        at java.lang.Thread.run(Thread.java:619)

   Locked ownable synchronizers:
        - None

Tomcat配置

我的Tomcat配置参数使用默认值,即

minSpareThreads = 25(因此Tomcat确保有25个线程可供处理 maxThreads = 200(200个请求可以并行处理而不发出警告)
acceptCount = 100(如果所有200个线程都忙,HTTP连接器可以排队另外100个请求)

问题

当我定期执行命令时,我看到线程总数增加。没有BLOCKING个帖子。

我不明白为什么线程数量在增加,因为WAITING状态有很多线程,准备处理另一个HTTP请求。

我也看到RUNNABLE + WAITING在一定时间内(例如1小时)保持不变,但随后它会增加5或6并再次保持不变。似乎线程池越来越大,直到达到限制并且Tomcat关闭......

TIMED_WAITING线程很可能来自在同一JVM中运行的Quartz Scheduler。

我对这些值的解释是不正确的?

1 个答案:

答案 0 :(得分:2)

您是否阅读过this article?引用一小章:

  

由于java ThreadPoolExecutor的FIFO行为,每个   线程将至少等待“maxIdleTime”之前的新任务   是否可以关闭。而且,再次因为FIFO   线程池的行为,对于要关闭的线程,它是必需的   至少等于 maxIdleTime 的时间段没有 ANY   请求进入