“CompilerThread0” daemon prio=9 tid=0x00509cb0 nid=0x1816600 waiting on condition [0x00000000..0xf0b06358]
“Signal Dispatcher” daemon prio=9 tid=0x00509840 nid=0x1816200 waiting on condition [0x00000000..0x00000000]
“Finalizer” daemon prio=8 tid=0x00509020 nid=0x1810200 in Object.wait() [0xf0a04000..0xf0a04ab0] at java.lang.Object.wait(Native Method) – waiting on <0x26580360> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) – locked <0x26580360> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
“Reference Handler” daemon prio=10 tid=0x00508c30 nid=0x180f200 in Object.wait() [0xf0983000..0xf0983ab0] at java.lang.Object.wait(Native Method) – waiting on <0x26580a50> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:474) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) – locked <0x26580a50> (a java.lang.ref.Reference$Lock)
“main” prio=5 tid=0x005013a0 nid=0x1804c00 waiting on condition [0xf07ff000..0xf08002c0] at java.lang.Thread.sleep(Native Method) at ThreadTest1.method1(ThreadTest1.java:7) at ThreadTest1.main(ThreadTest1.java:4)
JVM の種類、バージョンにより若干フォーマットは異なりますが、だいたい似たような形式になります。 Sun、HP、Apple、BEAの VM のうちどれか一つ慣れた VM で解析経験を積んでおけば他の JVM のスレッドダンプを読むのに困ることはないでしょう。 ただし、IBM の VM はかなり独特のフォーマットになっており独自の解析技術が必要になります。
内部的に勝手に生成されるスレッドの数、名前は JVM やバージョンによって異なります。 スタックトレースのないものや、スタックに記載されているクラス名が全部 java.* となっているものは大抵 VM 内部のスレッドですので無視して問題ありません。
ですので今回の例で興味深いのは "main" スレッドのにみになります。
以下に "main" スレッドのダンプだけを抽出します。
“main” prio=5 tid=0x005013a0 nid=0x1804c00 waiting on condition [0xf07ff000..0xf08002c0] at java.lang.Thread.sleep(Native Method) at ThreadTest1.method1(ThreadTest1.java:7) at ThreadTest1.main(ThreadTest1.java:4)
なにやら細々と情報が書いてあって構えてしまいますが、通常注目すべきなのは3点。 スレッド名(*1)、スレッドの状態(*2)、そしてスタックトレース(*3)です。 今回の例では main がスレッド名、waiting on condition がスレッドの状態、at java.lang.Thread.sleep 以降がスタックトレースになります。
"main"*1 prio=5 tid=0x005013a0 nid=0x1804c00 waiting on condition*2 [0xf07ff000..0xf08002c0] at java.lang.Thread.sleep(Native Method)*3 at ThreadTest1.method1(ThreadTest1.java:7) at ThreadTest1.main(ThreadTest1.java:4)