Interstage Application Server トラブルシューティング集 |
目次
索引
![]() ![]() |
付録A Javaツール機能 | > A.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 ********************************************************* -------------------------------------------------------------------------------
目次
索引
![]() ![]() |