Interstage Application Server トラブルシューティング集
目次 索引 前ページ

付録B Javaツール機能

B.4 スレッドダンプツール

■スレッドダンプツールとは

 スレッドダンプツールは、実行中の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オプションと同時に指定できません。

-j

ヘッダおよびフッタをJava VMの出力ルーチンを用いて出力する場合に指定します。
JNI(Java Native Interface)のJNI_CreateJavaVM()関数に、vfprintf_hookオプションを指定して起動したJava VMに対して指定します。JBKプラグインのjbkplugin.propertiesファイルに、"jbk.plugin.debug.showvmmsg=true"と指定した場合は、このオプションを使います。
-fオプションと同時に指定できません。

-p processid

対象とするプロセスをプロセスIDで指定します。

program name with ".exe"

対象とするプロセスをjava.exeなど".exe"で終わるコマンド名で指定します。
コマンド名が指定されると、スレッドダンプツールは、現在システムで動作しているすべてのプロセスのうち、指定されたコマンド名により起動されたプロセスから1つを選択して処理します。同じコマンドから複数のプロセスを起動している場合は、-pオプションを使用して、プロセスIDを指定してください。

■使用方法

■サンプルプログラムと出力例

 デッドロックのサンプルプログラムと、スレッドダンプの出力例を示します。

 サンプルプログラム

-------------------------------------------------------------------------------
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のスレッドダンプ出力に以下の機能を追加しています。

■注意事項

■動作環境

サポート対象のJava VM

 製品添付のJDK/JRE 1.3.1_12、1.4.2_05のHotSpot Client VM/FJVM


目次 索引 前ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005