我使用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
。
我一定是犯了一些愚蠢的错误!我怎样才能找到这些线程如何锁定这些锁?
答案 0 :(得分:0)
我不确定为什么您的方法无效。我希望它能工作。但是,如果您使用的是OpenJDK或Oracle JRE,请尝试另一种方法。
kill -3 <pid of java>
这会将所有线程及其锁转储到Java进程的标准中。 (它还会转储对象直方图,但您可以忽略它。)