ページの先頭行へ戻る
Interstage Application Server V12.0.0 トラブルシューティング集
FUJITSU Software

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

スレッドダンプの出力例

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

-------------------------------------------------------------------------------
****************************************************************
 Java Thread dump Tool
 Copyright(c) 2002-2016 FUJITSU LIMITED. All rights reserved.

  start at Tue Mar 21 10:44:29 2017

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

  Memory usage (Free/Total) = 5358640/6094848 (bytes)

 (ProcessId = 0x121c, Tool ThreadId = 0x13cc)
****************************************************************
2017-03-21 10:44:29
Full thread dump Java HotSpot(TM) Client VM (1.8.0_121_FUJITSU_MODIFIED-B09[25.121.13] mixed mode):

"Java Thread dump tool" #9 prio=5 os_prio=15 tid=0x0abc2400 nid=0x13cc waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Child" #8 prio=5 os_prio=0 tid=0x0abc1400 nid=0xcb4 waiting on condition [0x0b15f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
           at java.lang.Thread.sleep(Native Method)
           at Deadlock.run(Deadlock.java:8)
           - locked <0x046a1f00> (a Deadlock)
           at java.lang.Thread.run(Thread.java:745)

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x0aa96400 nid=0xb94 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x0aa8f000 nid=0xedc waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0aa87800 nid=0xa54 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0aa86800 nid=0xc6c runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0aa77c00 nid=0xefc in Object.wait() [0x0ad7f000]
   java.lang.Thread.State: WAITING (on object monitor)
           at java.lang.Object.wait(Native Method)
           - waiting on <0x04607ee0> (a java.lang.ref.ReferenceQueue$Lock)
           at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
           - locked <0x04607ee0> (a java.lang.ref.ReferenceQueue$Lock)
           at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
           at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00d4ec00 nid=0xb70 in Object.wait() [0x0acef000]
   java.lang.Thread.State: WAITING (on object monitor)
           at java.lang.Object.wait(Native Method)
           - waiting on <0x04605f68> (a java.lang.ref.Reference$Lock)
           at java.lang.Object.wait(Object.java:502)
           at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
           - locked <0x04605f68> (a java.lang.ref.Reference$Lock)
           at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=0 tid=0x006fb400 nid=0x1074 waiting for monitor entry [0x008af000]
   java.lang.Thread.State: BLOCKED (on object monitor)
           at Deadlock.main(Deadlock.java:25)
           - waiting to lock <0x046a1f00> (a Deadlock)

"VM Thread" os_prio=2 tid=0x00d4b000 nid=0x1128 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x0aadc000 nid=0xd30 waiting on condition 

JNI global references: 6

Heap
 def new generation   total 1856K, used 718K [0x04600000, 0x04800000, 0x06600000)
  eden space 1664K,  43% used [0x04600000, 0x046b3bd0, 0x047a0000)
  from space 192K,   0% used [0x047a0000, 0x047a0000, 0x047d0000)
  to   space 192K,   0% used [0x047d0000, 0x047d0000, 0x04800000)
 tenured generation   total 4096K, used 0K [0x06600000, 0x06a00000, 0x0a600000)
   the space 4096K,   0% used [0x06600000, 0x06600000, 0x06600200, 0x06a00000)
 Metaspace       used 1752K, capacity 2242K, committed 2368K, reserved 4480K

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