Interstage Application Server トラブルシューティング集 |
目次
索引
![]() |
付録B Javaツール機能 |
スレッドダンプツールは、実行中のJavaプログラムのスレッドダンプ(各スレッドのスタックトレース)を出力するツールです。
スレッドダンプツールはコマンドプロンプトから起動するコマンドで、モジュール名はthdump.exeです。
格納先は次のとおりです。
※製品を“C:\Interstage”にインストールした場合
thdump.exeが格納されたディレクトリを環境変数PATHに設定します。
もしくはthdump.exeをフルパスで起動します。
thdump.exe [-f logfile | -j] -p processid
または
thdump.exe [-f logfile | -j] program name with ".exe"
動作中のJava Virtual Machine(以降 Java VMと略します)で動作しているJavaプログラム、およびJava VMの各スレッドのスタックトレースをJava VMの動作しているプロセスの標準出力またはログファイルに出力します。
コマンドを実行すると、ヘッダ、スタックトレース、フッタの順に出力されます。
対象プロセスは、プロセスID、または、".exe"で終わるプログラム名(java.exeなど)で指定します。プロセスIDはWindowsの“タスクマネージャ”で参照可能です。また、Interstage管理コンソールのIJServerモニタ画面で、各ワークユニットのプロセスIDを参照可能です。
-f logfile |
スレッドダンプの出力先を指定します。 |
-j |
ヘッダおよびフッタをJava VMの出力ルーチンを用いて出力する場合に指定します。 |
-p processid |
対象とするプロセスをプロセスIDで指定します。 |
program name with ".exe" |
対象とするプロセスをjava.exeなど".exe"で終わるコマンド名で指定します。 |
C:\> thdump java.exe
C:\> thdump -f a.log -p 123
jbkplugin.propertiesファイル
--------------------------------------------------
jbk.plugin.debug.tracedir=C:\temp
jbk.plugin.debug.showvmmsg=true
--------------------------------------------------
C:\> thdump -j iexplore.exe
デッドロックのサンプルプログラムと、スレッドダンプの出力例を示します。
サンプルプログラム
------------------------------------------------------------------------------- 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()メソッドはロックを獲得できずに、ハングアップします。
以下は、JDK1.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 ********************************************************* -------------------------------------------------------------------------------
Javaには、特殊な操作を行うことで、スレッドダンプ(全スレッドのスタックトレース)を出力する仕組みが組み込まれています。スレッドダンプを出力する操作は以下のとおりです。
Windowsには、サービスとして動作するJavaプログラム(EJBやServletなど)や、Webブラウザ上で動作するJavaプログラム(アプレット)に対して、スレッドダンプを取得する方法がありません。スレッドダンプツールは、これらのプログラムでもスレッドダンプを取得できるようにしたものです。
スレッドダンプには、Java VM上で動作するJava VM内部のスレッドや、Javaアプリケーションの各スレッドのスタックトレースが出力されます。スレッドダンプを解析することで、アプリケーション全体や、各スレッドの実行状況をある程度解析することができます。
スレッドダンプの見方については“スレッドダンプ”を参照してください。
スレッドダンプツールは、Java VMのスレッドダンプ出力に以下の機能を追加しています。
製品添付のJDK/JRE 1.3.1_12、1.4.2_05のHotSpot Client VM/FJVM
目次
索引
![]() |