我做了一个观察,我想完全理解它。了解Apache Tomcat的线程转储6.0.26
首先,我经常服用线程转储和创建线程状态的总结:
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
=实际投放的要求web应用程序
TIMED_WAITING
=石英调度程序线程
WAITING
=空闲线程正在等待处理upco明HTTP请求等待的线程(都在等待这个样子的)的
例子:
"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个请求可以在paral无警告LEL)
acceptCount = 100
(HTTP连接器可以排队附加100个请求如果所有200个线程都忙)
问题
当我周期性地执行该命令,我看到的线程的总数正在增加。没有BLOCKING
线程。
我不明白为什么线程数量正在增加,因为WAITING
状态中有许多线程,准备处理另一个HTTP请求。
我也看到RUNNABLE
+ WAITING
是恒定的一段时间(例如1小时),但然后它增加5或6并保持不变。看起来线程池变得越来越大,直到达到限制并且Tomcat关闭...
TIMED_WAITING
线程很可能来自运行在相同JVM中的Quartz Scheduler。
我对这些值的解释是不正确的吗?
未来是,我发现那篇文章。所以我想知道为什么这样的设计是这样的... FILO战略会好得多,不是吗? 但是,最后一句话并不清楚:“对于要关闭的线程,要求至少等于maxIdleTime的时间段在没有任何请求进入的情况下通过”。这意味着“任何请求进入这个线程或一般任何线程? – basZero
我也同意这篇文章希望有更多的时间来尝试自己的线程池,并尝试建议LIFO/FILO选项。从我的理解,他谈到任何线索的请求,但不要听我的话 - 测试这个,让我们所有人知道! – mindas