我做了一个观察,我想完全理解它。
首先我定期进行线程转储并创建线程状态的摘要:
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。
我对这些值的解释是不正确的?
答案 0 :(得分:2)
您是否阅读过this article?引用一小章:
由于java ThreadPoolExecutor的FIFO行为,每个 线程将至少等待“maxIdleTime”之前的新任务 是否可以关闭。而且,再次因为FIFO 线程池的行为,对于要关闭的线程,它是必需的 至少等于 maxIdleTime 的时间段没有 ANY 请求进入