我的一个应用程序在负载运行的一段时间内挂起,是否有人知道在jstack中可能导致此类输出的原因:
"scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
当它挂起时,我在jstack输出中看到了很多.
我大量使用Spring @Async和地图,同步地图和ehcache.
有趣的是,这只发生在一个app实例上.另外两个人跑得很好.还有什么我可以调查以获得更多细节?
我发现这篇文章/sf/ask/1679495121/,但在我的情况下它并不是很有用.
在Java中,线程可以具有不同的状态:
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
但是,当线程被IO阻塞时,其状态为"RUNNABLE".如何判断它是否被IO阻止?