缺少Java线程转储中的线程

时间:2016-11-21 11:23:44

标签: java multithreading concurrency

我使用ThreadMXBean使用dumpAllThreads(true, true)报告线程列表:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
for (ThreadInfo info : bean.dumpAllThreads(true, true)) {
    writer.append(ThreadInfos.toStringFull(info));
}

然而,转储中的某些线程似乎不存在,更糟糕的是它们似乎拥有显示器!:

"pool-24-thread-16" Id=99 WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@a8bb29 owned by "ForkJoinPool-2-worker-13" Id=114
        at sun.misc.Unsafe.park(Native Method)
        -  waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@a8bb29
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(Unknown Source)
        at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(Unknown Source)
        at java.util.concurrent.locks.ReentrantLock.lock(Unknown Source)

在此示例中,ForkJoinPool-2-worker-13未列在线程转储中,因此很难看出它如何抓取ReentrantLock$NonfairSync@a8bb29

我一定是犯了一些愚蠢的错误!我怎样才能找到这些线程如何锁定这些锁?

1 个答案:

答案 0 :(得分:0)

我不确定为什么您的方法无效。我希望它能工作。但是,如果您使用的是OpenJDK或Oracle JRE,请尝试另一种方法。

kill -3 <pid of java>

这会将所有线程及其锁转储到Java进程的标准中。 (它还会转储对象直方图,但您可以忽略它。)