| 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
*********************************************************
-------------------------------------------------------------------------------
目次
索引
![]()
|