Java 什么是;锁定同步器的数量=1“;是什么意思?

Java 什么是;锁定同步器的数量=1“;是什么意思?,java,debugging,exception,logging,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

我目前正在编写我继承的一些代码。执行时,许多异常会记录到控制台,其中一个异常如下所示:

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

]
我正在使用的日志。现在我不知道在哪里生成或记录该异常,因为该信息被
剪切。 我也不知道这意味着什么。我想这与死锁有关(因为被锁定的同步器的数量=1),但我不确定


所以我的问题是:如何继续?那个异常意味着什么,我如何调试和找到它,以及如何解决它?我真的没有任何线索,如果有任何提示,我将不胜感激。谢谢

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

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

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

一种建议的方法是使用Linux审计系统(请参见
manauditctl
),另一种方法是使用systemtap。(我在这两方面都没有经验……但我在这里发现了一些跟踪信号的systemtap示例:)


值得一提的是,“同步器”是用于实现锁的构建块类;看见该行:

Number of locked synchronizers = 1
实际上是说线程当前持有一个锁。请注意,Oracle没有正式记录线程转储的含义,而且他们显然表示格式可能会随着版本/发行版的不同而变化。

我发现了它

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

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

所以它毕竟是一个线程转储,但它是内部触发的。谢谢你的回答

这看起来更像是线程转储,而不是常规堆栈跟踪。当某个东西向JVM进程发送SIGQUIT信号时,就会得到这些消息,@StephenC:如果是这样,线程是通过什么机制被转储的?如何拦截/调试/分析以找到原因?我不确定,但我认为这不正确。首先,这些转储或堆栈跟踪或它们出现在常规控制台中的任何东西,即程序的执行输出。第二,它们在启动程序时是决定性的,因此我认为不涉及其他过程。第三,使用JStack,输出(发送到单独的控制台)看起来更像:“信号调度器”守护进程prio=5 tid=0x00007f84e5014800 nid=0x3903 runnable[0x0000000000000000]java.lang.Thread.State:RUNNABLE1)线程转储也会转到控制台。2) 信号可能来自JVM启动的进程,也可能来自JVM启动器。3) 线程堆栈转储的格式是特定于Java版本的。如果这不是一个线程转储,我很想知道它实际上是什么。如果你明白了,请自己回答这个问题。谢谢你的帮助。毕竟我找到了(虽然花了我一段时间)。我会接受你的答案,因为这帮助我找到了我在另一个答案中发布的解决方案。