2013-01-22 58 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