StackTrace中"锁定的同步器数量= 1"是什么意思?

roe*_*erj 6 java debugging logging exception

我目前正在处理一些我继承的代码.执行它时,很多异常会记录到控制台,其中一个这样的异常如下所示:

["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

]
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*n C 1

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

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

本问答对如何追踪意外信号的来源有一些想法:

一种建议的方法是使用 Linux Audit 系统(请参阅 参考资料man auditctl),另一种方法是使用 systemtap。(我没有这方面的经验......但我确实发现了一些用于跟踪信号的 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
Run Code Online (Sandbox Code Playgroud)

实际上是说该线程当前持有一个锁。请注意,Oracle 没有正式记录线程转储的含义,并且他们显然表示格式可能会因版本/发行版而异。