It's a known bug: 6501158: Thread state is incorrect during class initialization procedure
I recalled the discussion for this bug but don't remember if we discussed enhancing the java.lang.management spec to cover "waiting" on VM internal actions.
David will probably have more information about this. Mandy Daniel D. Daugherty wrote:
Let's try that again with the attachement... Resending and including the Runtime team since I think that team owns deadlock detection support at this point... Dan -------- Original Message -------- Subject: Deadlocked Thread State is RUNNABLE? Date: Tue, 17 Nov 2009 16:00:28 -0800 From: Jeremy Manson <jeremyman...@google.com> To: serviceability-dev@openjdk.java.net Hi folks, I notice that when you send a sigquit to a VM, and threads are deadlocked in class initialization, then the thread state is reported as RUNNABLE. Is this deliberate? With the attached program (which mostly deadlocks on clinit - I don't have the time to remember how to write the 100-percent-will-always-deadlock version today), here is the output from JDK7 b74. 2009-11-17 15:41:14 Full thread dump OpenJDK Server VM (17.0-b03 mixed mode): "DestroyJavaVM" prio=10 tid=0xaf519c00 nid=0x2221 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "Thread-1" prio=10 tid=0xaf518000 nid=0x2230 in Object.wait() [0xaf3db000] java.lang.Thread.State: RUNNABLE at NPE$2.run(NPE.java:60) at java.lang.Thread.run(Thread.java:717) "Thread-0" prio=10 tid=0xaf516800 nid=0x222f in Object.wait() [0xaf42c000] java.lang.Thread.State: RUNNABLE at Base.<clinit>(NPE.java:33) at NPE$1.run(NPE.java:54) at java.lang.Thread.run(Thread.java:717) "Low Memory Detector" daemon prio=10 tid=0xaf500c00 nid=0x222d runnable [0x00000000] java.lang.Thread.State: RUNNABLE "CompilerThread1" daemon prio=10 tid=0x08109c00 nid=0x222c waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "CompilerThread0" daemon prio=10 tid=0x08107800 nid=0x222b waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x08105c00 nid=0x222a waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=10 tid=0x080f6c00 nid=0x2229 in Object.wait() [0xaf821000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xecf30bd0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0xecf30bd0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177) "Reference Handler" daemon prio=10 tid=0x080f2000 nid=0x2228 in Object.wait() [0xaf872000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xecf30990> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0xecf30990> (a java.lang.ref.Reference$Lock) "VM Thread" prio=10 tid=0x080ed400 nid=0x2227 runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x08057400 nid=0x2222 runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x08058c00 nid=0x2223 runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x0805a000 nid=0x2224 runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x0805b800 nid=0x2225 runnable "VM Periodic Task Thread" prio=10 tid=0xaf502c00 nid=0x222e waiting on condition JNI global references: 643 Heap PSYoungGen total 12480K, used 860K [0xecf30000, 0xedd10000, 0xf40f0000) eden space 10752K, 8% used [0xecf30000,0xed007148,0xed9b0000) from space 1728K, 0% used [0xedb60000,0xedb60000,0xedd10000) to space 1728K, 0% used [0xed9b0000,0xed9b0000,0xedb60000) PSOldGen total 113792K, used 0K [0xb40f0000, 0xbb010000, 0xecf30000) object space 113792K, 0% used [0xb40f0000,0xb40f0000,0xbb010000) PSPermGen total 16384K, used 1764K [0xb00f0000, 0xb10f0000, 0xb40f0000) object space 16384K, 10% used [0xb00f0000,0xb02a91d0,0xb10f0000)