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