在对生产环境中的一个 jvm 挂起问题进行故障排除时,我们遇到了执行以下记录器语句的线程之一
logger.debug("Loaded ids as " + ids + ".");
在这一步挂起,线程状态为可运行。这里 ids 是一个集合。还有另一个线程通过倒计时锁存器等待上述线程以完成其任务。该软件每 15 分钟进行一次线程转储,两个线程的堆栈跟踪如下所示
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 小时,最后我们不得不杀死它才能继续前进。线程转储表明有 43 个线程处于 RUNNABLE 状态,包括上述线程。
上述线程在执行 collection.toString() 时处于 RUNNABLE 状态 24 小时的原因可能是什么?
关于如何进行的任何建议?