Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解ApacheTomcat 6.0.26的线程转储_Java_Multithreading_Tomcat_Tomcat6_Threadpool - Fatal编程技术网

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