Java线程转储:BLOCKED线程没有“等待锁…”

我很难理解从jstack获取的线程转储,用于在Tomcat 6(java 1.6.0_22,Linux)上运行的Spring MVC Web应用程序.

我看到阻塞线程(导致其他线程等待),这些线程自动阻塞,但是线程转储不告诉我为什么或正在等待哪个监视器.

例:

"TP-Processor75" daemon prio=10 tid=0x00007f3e88448800 nid=0x56f5 waiting for monitor entry [0x00000000472bc000]
    java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Class.initAnnotationsIfNecessary(Class.java:3067)
        - locked <0x00007f3e9a0b3830> (a java.lang.Class for org.catapultframework.resource.ResourceObject)
        at java.lang.Class.getAnnotation(Class.java:3029)
        ...

即我错过了堆栈跟踪中的“等待锁…”行.显然,线程锁定了一个Class对象,但我不明白为什么线程本身被阻止.

线程转储不包含任何死锁提示.

我可以做些什么来识别锁定监视器?

谢谢,
奥利弗

最佳答案
显然,我们观察到这种阻塞线程的情况与大量内存消耗有关,因此大量的垃圾收集.

这个问题Java blocking issue: Why would JVM block threads in many different classes/methods?描述了类似的情况,所以我相信这些线程被垃圾回收器简单地阻止.

(无论如何,在解决了内存问题之后,阻塞线程的这个问题就消失了.)

转载注明原文:Java线程转储:BLOCKED线程没有“等待锁…” - 代码日志