web-dev-qa-db-ja.com

Tomcatで100スレッドTIMED_WAITING、スレッドの総数が200を超えるとストールします

最近、Tomcatのビジースレッドが200に達したため、本番のTomcatサーバーの1つが応答しなくなりました。再起動する前にスレッドダンプを取得すると、次の3つのスレッドのようなTIMED_WAITING状態のスレッドが100個取得されました。

""http-bio-7007"-exec-241" daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000]
Java.lang.Thread.State: TIMED_WAITING (parking)
   at Sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at Java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.Java:198)
   at Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.Java:2025)
   at Java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.Java:424)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:86)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:32)
   at Java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.Java:945)
   at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:907)
   at Java.lang.Thread.run(Thread.Java:662)

""http-bio-7007"-exec-237" daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000]
Java.lang.Thread.State: TIMED_WAITING (parking)
   at Sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at Java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.Java:198)
   at Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.Java:2025)
   at Java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.Java:424)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:86)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:32)
   at Java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.Java:945)
   at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:907)
   at Java.lang.Thread.run(Thread.Java:662)

""http-bio-7007"-exec-236" daemon prio=10 tid=0x00002aaab1118000 nid=0x596c waiting on condition [0x000000004e50c000]
Java.lang.Thread.State: TIMED_WAITING (parking)
   at Sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x0000000580d877d0> (a Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at Java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.Java:198)
   at Java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.Java:2025)
   at Java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.Java:424)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:86)
   at org.Apache.Tomcat.util.threads.TaskQueue.poll(TaskQueue.Java:32)
   at Java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.Java:945)
   at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:907)
   at Java.lang.Thread.run(Thread.Java:662)

4つのアプリケーションのスレッドプール(例:pool-4-thread-20など)もあり、それぞれに20のスレッドがあるので、これらの100のスレッドが待機しているブロッキングキューがわかりませんか?これの原因ではないように思われるHibernateでc3P0接続プールを使用しています。

Java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObjectとは何か考えはありますか?

15
ThinkFloyd

これは、c3p0によって管理されているDB接続をリークしていたコードを修正したときに修正されました。エンティティマネージャーをfinallyブロックで閉じる前に、特にcatchブロックでrollback()を呼び出さなかったコードのフローはほとんどなかったため、例外の場合、接続がプールに戻らず、例外の頻度が高い(サイズを超える)場合タイムアウト間隔内のプールの)その後、他のすべてのプロセススレッドが積み重なって接続を取得します。

9
ThinkFloyd

Java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObjectとは何か考えはありますか?

ConditionObjectは、異なるスレッドによるキューへのアクセスを同期するためにキュー内で使用されます。

エグゼキュータプールのスレッドがアイドル状態で新しいタスクを待機している場合の標準のスタックトレース。

5
Mirko