在我們的AppServer中,我們看到線程計數超過了其JMX線程數閾值(最大值= 500,實際值= 595)。運行的線程太多
我看到沒有死鎖。我已經採取了線程轉儲,並看到了595個的線程,其中大多數落入兩類:
1)234的線程在定時等待(如下所示線程轉儲)
"Timer-232" daemon prio=10 tid=0x00007f46c85cd000 nid=0x7b06 in Object.wait() [0x00007f4668001000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000075246c498> (a java.util.TaskQueue)
at java.util.TimerThread.mainLoop(Timer.java:509)
- locked <0x000000075246c498> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:462)
2)233處於等待狀態的線程(如下所示的線程轉儲)。我猜這是隊列中被阻塞的罪魁禍首,特別是延遲隊列。
"AsyncHttpClient-Reaper" daemon prio=10 tid=0x00007f469cd4c000 nid=0x7b09 waiting on condition [0x00007f4667cfe000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007524a2908> (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.DelayQueue.take(DelayQueue.java:160)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:609)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:602)
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:662)
你能幫我理解是什麼導致線程超過JMX閾值?這是我第一次使用線程場景,因此無法進行穩定的分析。提前致謝。
看起來你正在你的線程中運行長時間的工作,並且發佈了越來越多的工作。 – 2014-08-29 14:41:12
答案很簡單:您創建的線程太多。聽起來很明顯,但事實確實如此。分析的方式可以是每當你開始一個新線程時查看,看看造成最多線程的是什麼。或者檢查一下你是否可以找出這些線程正在做什麼以及它們爲什麼沒有完成...... – WarrenFaith 2014-08-29 14:41:55
正如斯圖爾特所建議的那樣,如果你能做到,學習Java的'Executors'和'ThreadPool'概念並重寫那些部分應用程序。 – watery 2014-08-29 23:13:53