2013-01-22 57 views
4

我做了一个观察,我想完全理解它。了解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。

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

回答

2

你看过this article吗?引用一个小章节:

因为Java的ThreadPoolExecutor的FIFO行为,每个 线程将在最短等待为“maxIdleTime”新任务 之前是eligable为关闭。此外,同样是因为线程池的FIFO 行为,对于一个线程来关闭它需要 在一段时间maxIdleTime至少等于通过不任何 请求

+1

未来是,我发现那篇文章。所以我想知道为什么这样的设计是这样的... FILO战略会好得多,不是吗? 但是,最后一句话并不清楚:“对于要关闭的线程,要求至少等于maxIdleTime的时间段在没有任何请求进入的情况下通过”。这意味着“任何请求进入这个线程或一般任何线程? – basZero

+0

我也同意这篇文章希望有更多的时间来尝试自己的线程池,并尝试建议LIFO/FILO选项。从我的理解,他谈到任何线索的请求,但不要听我的话 - 测试这个,让我们所有人知道! – mindas