我很难理解从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?描述了类似的情况,所以我相信这些线程被垃圾回收器简单地阻止.
(无论如何,在解决了内存问题之后,阻塞线程的这个问题就消失了.)