本番環境でjvmがハングした問題の1つをトラブルシューティングしているときに、次のロガーステートメントを実行するスレッドの1つに遭遇しました。
logger.debug("Loaded ids as " + ids + ".");
このステップで、スレッドステータスが実行可能としてハングします。ここでidsはセットです。カウントダウンラッチを介して上記のスレッドを待機し、タスクを完了する別のスレッドがあります。ソフトウェアは15分ごとにスレッドダンプを取得し、2つのスレッドのスタックトレースは次のようになります
Stack trace for [THREAD GROUP: Job_Executor] [THREAD NAME:main-Runner Thread][THREAD STATE: WAITING]
...sun.misc.Unsafe.park(Native Method)
...java.util.concurrent.locks.LockSupport.park(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
...java.util.concurrent.CountDownLatch.await(Unknown Source)
...com.runner.MainRunner.stopThread(MainRunnerRunner.java:1334)
Stack trace for [THREAD GROUP: Job_Executor] [THREAD NAME:task executor][THREAD STATE: RUNNABLE]
...java.util.AbstractCollection.toString(Unknown Source)
...java.lang.String.valueOf(Unknown Source)
...java.lang.StringBuilder.append(Unknown Source)
...com.runner.CriticalTaskExecutor.loadByIds(CriticalTaskExecutor.java:143)
このjvmはほぼ24時間ハングし、最終的に先に進むためにそれを強制終了する必要がありました。スレッドダンプは、上記を含めてRUNNABLE状態のスレッドが43個あることを示しています。
collection.toString()を実行するだけで、上記のスレッドが24時間RUNNABLE状態になる理由は何でしょうか。
続行する方法について何か提案はありますか?