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?描述了类似的情况,所以我相信这些线程被垃圾回收器简单地阻止.

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

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量