我们的应用是一款高负载的服务器应用。有时我们会陷入其中一个池中的所有线程都被卡住的情况。 OperationExecutor
池中的所有线程看起来都非常相似:
"OperationExecutor/pool-8-thread-787" daemon prio=6 tid=0x00000000432cc800 nid=0x44ac waiting on condition [0x0000000037e3f000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000548f585c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
at java.util.concurrent.LinkedBlockingQueue.poll(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
所有都在等待<0x0000000548f585c8>
锁定。看起来他们无法从池的队列中获得下一个任务。队列不是空的(确实很大)并且线程数是池允许的最大值(这意味着池最大化以消化队列)。我们使用LinkedBlockingQueue
作为池的队列。
这里是如何初始化池的:
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200, 200, THREAD_POOL_KEEPALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue(), new NamedThreadFactory(POOL_THREAD_NAME_PREFIX));
我的唯一想法是JVM在LinkedBlockingQueue
方面存在一些问题,但我的另一部分说它不是这样的问题。
有人可以更好地了解我们为什么会陷入这种困境吗?