什么"锁定的同步器数量= 1"在StackTrace意味着什么?

时间:2014-07-22 10:53:42

标签: java debugging exception logging

我目前正在处理一些我继承的代码。执行它时,很多异常都会记录到控制台,其中一个例外情况如下:

["bg-thread-0" Id=28 RUNNABLE
    at java.util.zip.ZipFile.read(Native Method)
    at java.util.zip.ZipFile.access$1400(ZipFile.java:56)
    at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:677)
    -  locked java.util.zip.ZipFile@67369c20
    at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:413)
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
    at org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry.getBytes(BundleEntry.java:102)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:511)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:455)
    ...

    Number of locked synchronizers = 1
    - java.util.concurrent.ThreadPoolExecutor$Worker@66e5b079

]

我正在使用Logback进行日志记录。现在我不知道生成或记录该异常的位置,因为该信息被...删除。 我也不知道这意味着什么。我想这与死锁有关(因为Number of locked synchronizers = 1),但我不确定。

所以我的问题是:如何在这里继续?该异常是什么意思,我如何调试和查找它以及如何解决它?我真的没有任何线索,并会欣赏任何提示。谢谢!

2 个答案:

答案 0 :(得分:1)

这看起来更像是Java线程转储,而不是常规的堆栈跟踪。 (我希望每个帖子都能看到其中一个。)

当JVM外部的东西向JVM进程发送SIGQUIT信号时,您(通常)会获得Java线程转储。

这个Q& A有一些关于如何追踪意外信号来源的想法:

一种建议的方法是使用Linux Audit系统(参见man auditctl),另一种方法是使用systemtap。 (我没有任何经验...但我确实发现了一些用于跟踪信号的系统示例:https://sourceware.org/systemtap/examples/)。


对于它的价值,一个"同步器"是构建块类,用于实现锁;见http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/package-summary.html。这一行:

Number of locked synchronizers = 1

实际上是说线程当前持有一个锁。请注意,Oracle不会正式记录线程转储的含义,并且他们显然表示格式可能会在不同的版本/版本中发生变化。

答案 1 :(得分:1)

我找到了它!

在代码深处,我发现了以下内容:

for (ThreadInfo threadInfo : ManagementFactory.getThreadMXBean().dumpAllThreads(true, true)) {
      System.out.println(threadInfo);
}

毕竟这是一个线程转储,但是内部触发了一个。谢谢你的答案!