1. ホーム
  2. java

[解決済み] sun.misc.Unsafe.park で WAITING (ネイティブメソッド)

2022-02-28 02:27:44

質問

私のアプリケーションの1つが、ある期間負荷をかけて実行するとハングアップします。誰か、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 & maps、synchronized maps & ehcacheを多用しています。

興味深いのは、この現象がアプリのインスタンスの1つでしか起きていないことです。他の2つのインスタンスは全く問題なく動作しています。 このような場合、他に何を調査すればより詳細な情報を得ることができますか?

こんな投稿がありました。 https://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds が、私の場合、あまり役に立ちません。

解決方法は?

unsafe.parkは、アーキテクチャ固有のコードを使用していることを除けば、thread.waitとほとんど同じです(したがって、「unsafe」である理由)。 unsafeは一般に公開されていませんが、アーキテクチャ固有のコードが大きな最適化の利点をもたらすであろうJava内部ライブラリで使用されています。スレッドプーリングによく使われます。

つまり、あなたの質問に答えると、スレッドがやっていることは何かを待っているだけで、実際にはCPUを使っていないのです。元のスタック・トレースでロックを使用していることを考えると、このケースではデッドロックが発生していると考えられます。

そうですね、あなたはもうほとんどこの問題を解決していることでしょう。しかし、誰かが sun.misc.unsafe.park でググると、あなたはトップ結果の1つになっています。この質問に答えることで、CPUをすべて使っているように見えるこのメソッドが何であるかを理解しようとしている他の人の助けになるかもしれないと思いました。