我的一个应用程序在负载下运行一段时间后挂起,有人知道是什么会导致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)
我在挂起的jstack输出中看到了很多。
我大量使用Spring @Async和地图,同步地图和ehcache。
有趣的是,这仅发生在一个应用实例上。另外两个运行得很好。在这种情况下,我还能进行哪些调查以获取更多详细信息?
unsafe.park与thread.wait几乎相同,除了它使用的是体系结构特定的代码(因此它是“不安全的”)。unsafe不会公开提供,但是会在Java内部库中使用,在Java内部库中,特定于体系结构的代码将提供明显的优化好处。它在线程池中使用了很多。
因此,要回答您的问题,线程正在做的就是等待某件事,它实际上并没有使用任何CPU。考虑到原始堆栈跟踪表明您正在使用锁,因此我认为您遇到的情况是死锁一直在发生。
是的,我知道您几乎可以肯定已经解决了这个问题。但是,如果有人用Google搜索sun.misc.unsafe.park,您将是最高的搜索结果之一。我认为回答这个问题可能会帮助其他人了解这种似乎正在使用其所有CPU的方法。