ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server トラブルシューティング集
Interstage

A.3.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()メソッドはロックを獲得できずに、ハングアップします。

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

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

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

  start at Tue Jan 11 10:38:25 2011

  cmd = C:\Interstage\JDK6\bin\java.exe Deadlock

  Memory usage (Free/Total) = 7470040/7864320 (bytes)

 (ProcessId = 0x754, Tool ThreadId = 0xe98)
****************************************************************

Full thread dump Java HotSpot(TM) Server VM (17.1.03_FUJITSU_MODIFIED-B11 mixed mode):
 [pid=1876] Time=Tue Jan 11 10:38:25 2011


"Java Thread dump tool" prio=10 tid=0x03c0f800 nid=0xe98 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Child" prio=6 tid=0x03c0e000 nid=0xbec waiting on condition [0x045cf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
           at java.lang.Thread.sleep(Native Method)
           at Deadlock.run(Deadlock.java:8)
           - locked <0x0fd98740> (a Deadlock)
           at java.lang.Thread.run(Thread.java:619)

"Low Memory Detector" daemon prio=6 tid=0x03bf9000 nid=0x918 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x03c08800 nid=0x59c waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x03c03800 nid=0xb5c waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x03e49800 nid=0x2b8 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x03e5a800 nid=0x2fc runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x03bea800 nid=0x170 in Object.wait() [0x03e3f000]
   java.lang.Thread.State: WAITING (on object monitor)
           at java.lang.Object.wait(Native Method)
           - waiting on <0x0fd60b18> (a java.lang.ref.ReferenceQueue$Lock)
           at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
           - locked <0x0fd60b18> (a java.lang.ref.ReferenceQueue$Lock)
           at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
           at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x03be5c00 nid=0xb04 in Object.wait() [0x03def000]
   java.lang.Thread.State: WAITING (on object monitor)
           at java.lang.Object.wait(Native Method)
           - waiting on <0x0fd60a20> (a java.lang.ref.Reference$Lock)
           at java.lang.Object.wait(Object.java:485)
           at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
           - locked <0x0fd60a20> (a java.lang.ref.Reference$Lock)

"main" prio=6 tid=0x00317000 nid=0xe80 waiting for monitor entry [0x0093f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
           at Deadlock.main(Deadlock.java:25)
           - waiting to lock <0x0fd98740> (a Deadlock)

"VM Thread" prio=10 tid=0x03be2c00 nid=0xd34 runnable 

"GC task thread#0 (ParallelGC)" prio=6 tid=0x0031e800 nid=0xc84 runnable 

"GC task thread#1 (ParallelGC)" prio=6 tid=0x03b10400 nid=0xaa4 runnable 

"GC task thread#2 (ParallelGC)" prio=6 tid=0x03b11400 nid=0xe7c runnable 

"GC task thread#3 (ParallelGC)" prio=6 tid=0x03b12800 nid=0x480 runnable 

"VM Periodic Task Thread" prio=10 tid=0x03bfac00 nid=0xe88 waiting on condition 

"RAS Control Thread" prio=10 tid=0x03be2000 nid=0xb4c runnable 
JNI global references: 854

Heap
 PSYoungGen      total 3584K, used 385K [0x0fd60000, 0x10160000, 0x10470000)
  eden space 3072K, 12% used [0x0fd60000,0x0fdc0428,0x10060000)
  from space 512K, 0% used [0x100e0000,0x100e0000,0x10160000)
  to   space 512K, 0% used [0x10060000,0x10060000,0x100e0000)
 PSOldGen        total 4096K, used 0K [0x0c470000, 0x0c870000, 0x0fd60000)
  object space 4096K, 0% used [0x0c470000,0x0c470000,0x0c870000)
 PSPermGen       total 16384K, used 2012K [0x08470000, 0x09470000, 0x0c470000)
  object space 16384K, 12% used [0x08470000,0x08667288,0x09470000)

****************************************************************
 Java Thread dump end
****************************************************************
-------------------------------------------------------------------------------