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

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

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

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

 ■サンプルプログラム

-------------------------------------------------------------------------------
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 1.3.1におけるスレッドダンプの出力例を次に示します。

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

  start at Wed Sep 24 13:42:05 2003

  cmd = c:\Interstage\jdk13\bin\java Deadlock
 (ProcessId = 0x4c0, Tool ThreadId = 0x658)
****************************************************************
 Full thread dump Java HotSpot(TM) Server VM (1.3.1_FUJITSU_MODIFIED-B34 mixed mode):
 [pid=1556] Time=Wed Sep 08 10:37:22 2004

"Thread-0" prio=10 tid=0x8ae1d0 nid=0x658 waiting on monitor [0..0x8eefd38]

"Child" prio=5 tid=0x89d9038 nid=0x630 waiting on monitor [0x8d8f000..0x8d8fdbc]
    at java.lang.Thread.sleep(Native Method)
    at Deadlock.run(Deadlock.java:9)
    - locked <29700b8> (a Deadlock)
    at java.lang.Thread.run(Thread.java:479)

"Signal Dispatcher" daemon prio=10 tid=0x80f5a0 nid=0x674 waiting on monitor [0..0]

"Finalizer" daemon prio=9 tid=0x8990d10 nid=0x2b0 waiting on monitor
 [0x8c4f000..0x8c4fdbc]
    at java.lang.Object.wait(Native Method)
    - waiting on <2930328> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:103)
    - locked <2930328> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:157)

"Reference Handler" daemon prio=10 tid=0x8990078 nid=0x444 waiting on monitor
 [0x8c0f000..0x8c0fdbc]
    at java.lang.Object.wait(Native Method)
    - waiting on <2930238> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:415)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:105)
    - locked <2930238> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x282900 nid=0x6a4 waiting for monitor entry [0x6f000..0x6fc34]
    at Deadlock.main(Deadlock.java:26)
    - waiting to lock <29700b8> (a Deadlock)

"VM Thread" prio=5 tid=0x28d9c8 nid=0x6cc runnable

"VM Periodic Task Thread" prio=10 tid=0x803ae8 nid=0x628 waiting on monitor
"Suspend Checker Thread" prio=10 tid=0x80ec58 nid=0x6dc runnable
*********************************************************
 Java Thread dump end
*********************************************************
-------------------------------------------------------------------------------

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

Copyright 2007 FUJITSU LIMITED