2016-10-17 14 views
11

私のTomcatアプリケーションサーバーのスレッド数は、毎日になるです。java.lang.Thread.Stateの90%スレッドの分析:WAITING(パーキング)

私は分析のためにスレッドダンプを取った。

430スレッドのうち307スレッドがこのステータスになっています。

サンプルスタックトレース

"pool-283-thread-1" #2308674 prio=5 os_prio=0 tid=0x000000000a916800 nid=0x1101 waiting on condition [0x00002aec87f17000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000006d9929ec0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

    Locked ownable synchronizers: 
    - None 

"pool-282-thread-1" #2307106 prio=5 os_prio=0 tid=0x000000000a4fb000 nid=0x78e3 waiting on condition [0x00002aec87e16000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000006d8ca7bf8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

    Locked ownable synchronizers: 
    - None 

環境

JDK: jdk1.8.0_60 
OS: Linux 
Tomcat: tomcat-7.0.65 

これが問題を引き起こしているかどうかわかりません。

これに関するお手伝いをお待ちしております。

+2

これらのスレッドは、キュー内のタスクを待機しているスレッドプールのようです。そのスレッドプールとキューをどのようにセットアップするか教えてください。 –

+0

スレッドプール/ ExecutorServiceでシャットダウンが発生することはありますか? – Fildor

答えて

13

これは一般的なリソースリークです。アプリケーションのどこかに何らかの種類のExecutorServiceを使用しており、作業が完了した後にそのプールを閉じずにスレッドを永遠に待っています。

プールを終了し、作業が完了したらスレッドを解放/終了するには、ExecutorService#shutdown()に電話する必要があります。

pool-282-thread-1pool-283-thread-1のようなスレッド名は、(プール番号が大きく、スレッド番号が1であるため)シングルスレッドプールエグゼキュータを使用している可能性が最も高いと示唆しています。 ExecutorServiceの背後にあるアイデアは、何らかの作業をするためにアイドル状態のスレッドを再利用することです。したがって、新しい背景を作成する必要があるたびに、新しいExecutorServiceを作成する必要があるため、単一のインスタンスを共有してアプリケーションで使用する必要があります。