Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java thread dump: BLOCKED thread without "waiting to lock ..."

Tags:

I'm having difficulties in understanding the thread dump I got from jstack for a Spring MVC web application running on Tomcat 6 (java 1.6.0_22, Linux).

I see blocking threads (that cause other threads to wait) which are blocked themselves, however the thread dump doesn't tell me why or for which monitor they are waiting.

Example:

"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)         ... 

I.e. I am missing the "waiting to lock ..." line in the stack trace. Apparently the thread locks a Class object, but I don't see why the thread itself is blocked.

The thread-dump does not contain any hints for deadlocks.

What can I do to identify the locking monitor?

Thanks, Oliver

like image 337
Oliver Avatar asked Aug 15 '11 15:08

Oliver


2 Answers

Apparently the situation where we observed these kinds of blocked threads were related to heavy memory consumption and therefore massive garbage collection.

This question Java blocking issue: Why would JVM block threads in many different classes/methods? describes a similar situation, so I believe these threads were simply blocked by the garbage collector.

(Anyway, after solving the memory issue this problem with the blocking threads was gone.)

like image 117
Oliver Avatar answered Sep 28 '22 03:09

Oliver


Check if the finalizer thread is blocked or waiting.

During a GC sweep, the GC will "stop the world" to perform its cleanup. The definition of "world" depends on the garbage collector being used and context. It may be a small cluster of threads or all of them. Before officially collecting garbage, GC will invoke the object's finalize().

If you are in the undesirable situation where you are implementing finalizer methods, the finalization code may be blocking it from finishing and the 'world' stays stopped.

This is most obvious when seeing lots of threads being permanently-blocked by some unknown magic force: Look up the code where the blocking occurs and it will make no sense; there is no blocking code to be found anywhere near it and the dumps will not divulge what monitor it is waiting on because there isn't one. The GC has paused the threads.

like image 25
user515655 Avatar answered Sep 28 '22 02:09

user515655