2011-11-10 80 views
24

我注意到我的java應用程序(在tomcat6上運行)產生了很多不終止的線程。找到等待/睡眠線程的原因

所以我創建了一個線程轉儲,發現有噸等待的線程,就像這樣:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:680) 
    Locked ownable synchronizers: 
    - None 

現在的問題是:什麼是這些線程在等待什麼? 我懷疑類似乎產生這些線程,但我不知道究竟是什麼使這些線程卡住。

有沒有什麼我可以做的,以找到原因,除了撕裂類逐行逐行並保持監視線程行爲?

+1

恩,他們阻塞了隊列。具體來說,當一個隊列爲空時,LinkedBlockingQueue.take()會無限期地阻塞。 –

+1

這是什麼意思?什麼隊列和'()()'做的方法是什麼? – Timo

+1

呃,這是你的代碼......我們不是通靈。只要告訴你線程轉儲告訴你什麼。 –

回答

19

在tomcat上,他們通常會請求工作線程等待某人連接。 沒什麼好擔心的。他們已準備好處理那些一次連接到服務器的100個用戶。

+0

那不可能。我可以明確地點擊我的應用程序中產生這些線程的按鈕。一旦點擊,這些線程就會出現。一段時間後,這些線程消耗了太多的內存,導致服務器崩潰。 – Timo

+0

如果一個線程被阻塞(例如,在一個隊列中等待),它們不能消耗更多的內存 - 它們沒有運行,因此不能請求任何內存。如果有的話,他們的堆棧可能會在等待一段時間後分頁,因此實際上減少了真正的RAM使用。 –

+5

我會對此表示同意@ptyx。推測在應用程序中單擊按鈕會向Tomcat服務器發送請求。我的猜測是,你的配置錯誤,告訴Tomcat能夠處理大量的請求,因爲你想成爲企業級用戶。 Tomcat不斷在其ThreadPoolExecutor中創建一個新的'Thread',因爲它還沒有達到'corePoolSize'。最終崩潰你的服務器,因爲你已經配置了大量的線程,但不允許有足夠的內存來分配這些線程所需的所有堆棧空間。但這只是我的猜測。 –

6

這些線程是ThreadPool的一部分。更詳細的說java.util.concurrent.ThreadPoolExecutor。線程正在等待Runnable/Callable被提交給池。例如

ExecutorService e = Executors.newFixedThreadPool(10); 

將創建10個線程,將坐在一個等待狀態,直到

e.submit(new Runnable(){ 
    public void run(){ ...} 
}); 

然後一個線程將被通知並調用該Runnable。他們正在使用什麼,我無法分辨。你必須找出啓動線程池的內容。也許它的處理客戶端請求應用程序服務器。

+0

不要這樣想。這些線程不固定。它們是在用戶與應用程序交互時動態創建的。經過長時間的使用,其中有數百個,而不僅僅是10個。 – Timo

+0

我想你必須找出用戶交互後會發生什麼。任何人都可以像我在示例中看到的那樣創建這些線程。如果您爲我們提供更多的代碼,我們可以提供幫助。 –