Interstage Application Server/Interstage Web Server トラブルシューティング集
目次 索引 前ページ次ページ

付録A Javaツール機能> A.4 スレッドダンプツール

A.4.4 サンプルプログラムと出力例

 以下にデッドロックのサンプルプログラムと、スレッドダンプの出力例を示します。

 スレッドダンプの解析方法は、“チューニングガイド”の“JDK/JREのチューニング”の“スレッドダンプ”を参照してください。

 ■サンプルプログラム

-------------------------------------------------------------------------------
public class Deadlock implements Runnable {
  volatile boolean finished = false;
  public void run() {
    try {
      synchronized (this) {
        while (!finished) {
          System.out.print(".");
          Thread.sleep(500);
        }
      }
    }
    catch (InterruptedException ex) {
      ex.printStackTrace(System.out);
      Thread.currentThread().interrupt();
    }
  }
  public static void main(String args[]) {
    Object obj = new Object();
    Deadlock test = new Deadlock();
    Thread th = new Thread(test, "Child");
    try {
      th.start();
      Thread.sleep(5000);
      synchronized (test) {
        test.finished = true;
      }
    }
    catch (Exception ex) {
      ex.printStackTrace(System.out);
    }
  }
}
-------------------------------------------------------------------------------

 このサンプルプログラムは、run()メソッドで、DeadLockクラスのインスタンスに対して、synchronized句によりロックを取得しています。run()メソッドは、finishedフラグがfalseの間ループを繰り返します。一方、main()メソッドは、run()メソッド呼出し後に、DeadLockクラスのインスタンスに対してロックを獲得できたならば、finishedフラグをtrueに設定します。
 この例の場合、run()メソッドが、DeadLockクラスのインスタンスに対してロックを獲得していますので、main()メソッドはロックを獲得できずに、ハングアップします。

 ■スレッドダンプの出力例

 JDK 5.0におけるスレッドダンプの出力例を次に示します。

-------------------------------------------------------------------------------
****************************************************************
 Java Thread dump Tool for WindowsNT/2000/XP
 Copyright(c) 2002 FUJITSU LIMITED. All rights reserved.

  start at Tue Jan 23 15:41:52 2007

  cmd = C:\Interstage\jdk50\bin\java Deadlock

  Memory usage (Free/Total) = 4710952/5111808 (bytes)

 (ProcessId = 0x9fc, Tool ThreadId = 0x764)
****************************************************************

Full thread dump Java HotSpot(TM) Server VM (1.5.0_FUJITSU_MODIFIED-B02 mixed mode):
 [pid=2556] Time=Tue Jan 23 15:41:52 2007


"Java Thread dump tool" prio=10 tid=0x03c96510 nid=0x764 waiting on condition [0x00000000..0x046dfd60]

"Child" prio=6 tid=0x03c8be00 nid=0xfec waiting on condition [0x0457f000..0x0457fa1c]
    at java.lang.Thread.sleep(Native Method)
    at Deadlock.run(Deadlock.java:8)
    - locked <0x179411b0> (a Deadlock)
    at java.lang.Thread.run(Thread.java:595)

"Low Memory Detector" daemon prio=6 tid=0x03c91188 nid=0xfe4 runnable [0x00000000..0x00000000]

"CompilerThread1" daemon prio=10 tid=0x03c8fe78 nid=0xfd4 waiting on condition [0x00000000..0x00000000]

"CompilerThread0" daemon prio=10 tid=0x00b1d460 nid=0xb00 waiting on condition [0x00000000..0x00000000]

"AdapterThread" daemon prio=10 tid=0x03c87ad0 nid=0xb50 waiting on condition [0x00000000..0x00000000]

"Signal Dispatcher" daemon prio=10 tid=0x03c8c5a8 nid=0xea4 runnable [0x00000000..0x00000000]

"Finalizer" daemon prio=8 tid=0x00b184e8 nid=0xef0 in Object.wait() [0x03c7f000..0x03c7fd9c]
    at java.lang.Object.wait(Native Method)
    - waiting on <0x179006e0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
    - locked <0x179006e0> (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=0x00b17458 nid=0xb0c in Object.wait() [0x03c3f000..0x03c3fa1c]
    at java.lang.Object.wait(Native Method)
    - waiting on <0x179005f0> (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 <0x179005f0> (a java.lang.ref.Reference$Lock)

"main" prio=6 tid=0x000359e0 nid=0xac8 waiting for monitor entry [0x0007f000..0x0007fbf8]
    at Deadlock.main(Deadlock.java:25)
    - waiting to lock <0x179411b0> (a Deadlock)

"VM Thread" prio=10 tid=0x00b151d0 nid=0x844 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x0003b578 nid=0xab8 runnable

"VM Periodic Task Thread" prio=10 tid=0x03c92a48 nid=0x84 waiting on condition

"RAS Control Thread" prio=10 tid=0x00b14fd0 nid=0xaa4 runnable
****************************************************************
 Java Thread dump end
****************************************************************
-------------------------------------------------------------------------------

目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED