Java JVM线程转储包含未锁定线程的监视器

Java JVM线程转储包含未锁定线程的监视器,java,multithreading,Java,Multithreading,JVM线程转储显示线程等待在监视器上锁定,但监视器没有相应的锁定线程,这可能是什么原因 Windows 2003上的Java 1.5_14这只是一个猜测,但可能是线程通过尝试获取两次锁来锁定自己吗?如果您能发布一些代码,可能会有所帮助。是的,通常每个被锁定的监视器都必须有一个所有者线程。可能堆栈转储不完整(太长),或者转储不一致。我可以想象,它并没有阻止世界,所以一个被锁定的监视器被转储,但是拥有锁的线程在被转储之前释放了它(这只是一个猜测) 你能在哪里上传转储文件作为文本文件以便于搜索,并告诉

JVM线程转储显示线程等待在监视器上锁定,但监视器没有相应的锁定线程,这可能是什么原因


Windows 2003上的Java 1.5_14这只是一个猜测,但可能是线程通过尝试获取两次锁来锁定自己吗?如果您能发布一些代码,可能会有所帮助。

是的,通常每个被锁定的监视器都必须有一个所有者线程。可能堆栈转储不完整(太长),或者转储不一致。我可以想象,它并没有阻止世界,所以一个被锁定的监视器被转储,但是拥有锁的线程在被转储之前释放了它(这只是一个猜测)


你能在哪里上传转储文件作为文本文件以便于搜索,并告诉我们你在看哪个监视器。

你的代码有任何变化都会使用JNI吗?(即,您是否运行任何从Java启动的本机代码?)

我们已经看到了类似的行为,但是JDK1.6.0_05。应用程序看起来是死锁,但Jstack显示线程正在等待一个没有其他线程持有的锁。我们有一些JNI代码,所以有可能我们正在破坏某些东西


我们还没有找到解决方案,这个问题只能在一台机器上重现。

那些等待的线程是永远等待还是最终继续

如果是后者,则可能是锁由垃圾收集器持有

您可以在java命令行上添加参数
-verbose:gc和-XX:+PrintGCDetails
,以便在发生GCs时被告知。如果gc活动与您的减速同时发生,则可能表明这就是问题所在


这里有一些。

我今天遇到了一个类似的问题,它还涉及对静态资源的访问

简短的版本是,一个类在静态块中进行GUI更改,在AWT事件队列线程之外(AWT TreeLock阻止了该线程),然后事件队列引用了被阻止的类,这迫使它在类加载器的监视器上等待该类

这里的关键观察是,类加载器的锁在线程转储中没有显示为锁定


可以找到完整的答案

您是否尝试过升级到Java 1.6?如果您只使用1.5版,则可能会出现错误。

您是否有我们可以看到的转储?它们最终会在几分钟后继续运行。如何确认它是否由垃圾收集器持有。我应该在线程转储中看到垃圾收集器线程吗?