Java 理解ApacheTomcat 6.0.26的线程转储
我做了一个观察,我想完全理解它 首先,我定期进行线程转储并创建线程状态摘要:Java 理解ApacheTomcat 6.0.26的线程转储,java,multithreading,tomcat,tomcat6,threadpool,Java,Multithreading,Tomcat,Tomcat6,Threadpool,我做了一个观察,我想完全理解它 首先,我定期进行线程转储并创建线程状态摘要: jstack -l 19498 > dump.txt ; awk '/State: / { print }' < dump.txt | sort | uniq -c RUNNABLE=实际为web应用程序的请求提供服务 TIMED_WAITING=石英调度程序线程 等待=等待处理即将到来的HTTP请求的空闲线程 等待线程示例(所有等待线程如下所示): 对象中的“http-80-178”守护进程prio=
jstack -l 19498 > dump.txt ; awk '/State: / { print }' < dump.txt | sort | uniq -c
RUNNABLE
=实际为web应用程序的请求提供服务TIMED_WAITING
=石英调度程序线程等待
=等待处理即将到来的HTTP请求的空闲线程
等待线程示例(所有等待线程如下所示):
对象中的“http-80-178”守护进程prio=10 tid=0x00007fa8c0bbe000 nid=0x2e11.wait()[0x00007fa8aaae9000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(org.apache.tomcat.util.net.JIoEndpoint$Worker)
等待(Object.java:485)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
-锁定(org.apache.tomcat.util.net.JIoEndpoint$Worker)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
运行(Thread.java:619)
锁定可拥有的同步器:
-没有
Tomcat配置
我的Tomcat配置参数使用默认值,即
minSpareThreads=25
(因此Tomcat确保有25个线程可供处理
maxThreads=200
(可以并行处理200个请求,而无需发出警告)acceptCount=100
(如果所有200个线程都忙,HTTP连接器可以将额外的100个请求排队)
问题
当我周期性地执行命令时,我看到线程总数在增加。没有阻塞
线程
我不明白为什么线程数量在增加,因为有许多线程处于等待状态,准备处理另一个HTTP请求
我还看到RUNNABLE
+WAITING
在一段时间内(例如1小时)是恒定的,但随后它增加了5或6,并再次保持恒定。线程池似乎越来越大,直到达到限制,Tomcat关闭为止
TIMED_WAITING
线程很可能来自运行在同一JVM中的Quartz调度程序
我对这些值的解释不正确吗?你读过吗?引用一小章:
由于java ThreadPoolExecutor的FIFO行为,每个
线程将至少等待“maxIdleTime”的新任务,然后再执行
可免除关闭。此外,由于FIFO
线程池的行为,对于要关闭的线程,它是必需的
至少等于maxIdleTime的一段时间没有任何
请求进来
是的,我找到了那篇文章。所以我想知道为什么这篇文章是这样设计的……一个FILO策略会更好,不是吗?然而,最后一句话并不清楚:“对于一个线程来说,需要一段至少等于maxIdleTime的时间,并且没有任何请求进入”。这意味着什么“任何针对该线程或一般针对任何线程的请求?我也同意这篇文章。Wish本人有更多时间尝试线程池,并尝试建议的后进先出/后进先出选项。据我所知,他对任何线程都提到了请求。但不要相信我的话——测试一下,让我们所有人都知道!”!
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)
"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