5.5 JavaVMのスレッドダンプの内容

JavaVMのスレッドダンプを調査すると,システムのデッドロックなどのjavaプログラムレベルでのトラブル要因の調査が容易になります。

出力される情報の種類は,J2EEサーバの起動時に指定しているオプションによって異なります。JavaVMの資料取得の設定については,「3.3.19 JavaVMの資料取得の設定」を参照してください。

<この節の構成>
(1) スレッドダンプ情報の構成
(2) スレッドダンプと性能解析トレースファイルとの対応
(3) Explicitヒープ詳細情報の出力内容

(1) スレッドダンプ情報の構成

JavaVMのスレッドダンプ情報の構成を次の表に示します。

表5-21 スレッドダンプ情報の構成

出力情報内容
ヘッダ日付,JavaVMバージョン情報,起動コマンドラインを出力します。
システム設定次の情報を出力します。
  • JDKの実行環境のインストール場所を表すJavaホームパス
  • JDKを構成するライブラリのインストールディレクトリを表すJava DLLパス
  • システムクラスパス
  • Javaコマンドオプション
動作環境次の情報を出力します。
  • ホスト名
  • OSバージョン
  • CPU情報
  • リソース情報(UNIXの場合)
メモリ情報(Windowsの場合)現在のメモリ使用量および各未使用サイズ情報を出力します。
Javaヒープ情報Javaヒープの各世代のメモリ使用状況を出力します。
JavaVM内部メモリマップ情報JavaVM自身の確保しているメモリの領域情報を出力します。
JavaVM内部メモリサイズ情報JavaVM自身の確保しているメモリのサイズ情報を出力します。
アプリケーション環境次の情報を出力します。
  • シグナルハンドラ
  • 環境変数
ライブラリ情報ローディングされているライブラリの情報を出力します。
スレッド情報
<スレッド1>
:
<スレッドn>
スレッドごとにスレッド情報を出力します。
JavaモニタダンプJavaモニタオブジェクトの一覧を表示します。
Rawモニタダンプ※1Java内部で使われるモニタ情報の一覧を出力します。Row monitorが使用された場合だけ出力されます。
JNIグローバル参照情報※2JavaVMが保持しているJNIのグローバル参照の数を出力します。
Explicitヒープ詳細情報明示管理ヒープ機能使用時には,Javaプロセスのクラスごとに次の情報を出力します。
  • Explicitヒープ全体の利用状況
  • Explicitメモリブロックごとの利用状況
また,明示管理ヒープ機能使用時に,eheapprofコマンドを実行すると,Explicitメモリブロック内のオブジェクトの統計情報を出力します。
クラス別統計情報jheapprofコマンドで指定したJavaプロセスのクラスごとに次の情報を出力します。
  • インスタンスがメンバとして持つインスタンスの合計サイズ,およびインスタンスの参照関係
  • staticメンバが持つインスタンスの合計サイズ
  • Tenured領域の増加原因となるオブジェクトのクラス,およびインスタンスの合計サイズ
フッタスレッドダンプが終了した時刻を表示します。
注※1
RawモニタダンプはJDKのバージョンがJDK 5.0の場合に出力されます。
注※2
JNIグローバル参照情報はJDKのバージョンがJDK 6の場合に出力されます。

JavaVMのスレッドダンプ情報の詳細については,マニュアル「Cosminexus アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「-XX:[+|-]HitachiThreadDump(拡張スレッドダンプ情報出力オプション)」を参照してください。なお,クラス別統計情報については,「8.3 クラス別統計機能」を参照してください。Explicitヒープ詳細情報については,「(3) Explicitヒープ詳細情報の出力内容」を参照してください。

(2) スレッドダンプと性能解析トレースファイルとの対応

J2EEアプリケーションやバッチアプリケーションでスローダウンやハングアップが発生した時に,スレッドダンプと性能解析トレースを対応づけることで,問題が発生した個所を調査できます。

スレッドダンプと性能解析トレースファイルの対応づけには,スレッドダンプに出力されたスレッド情報のnativeID(OSレベルのスレッドID)と性能解析トレースファイルに出力されたスレッドIDを使用します。スレッドダンプから対応する性能解析トレースファイルを特定する手順について説明します。

  1. スレッドダンプ,および性能解析トレースファイルを収集します。
    スレッドダンプの収集方法については,「4.7 JavaVMのスレッドダンプ」を参照してください。性能解析トレースファイルの収集方法については,「6.3.1 性能解析トレースファイルの収集方法」を参照してください。
  2. 使用するスレッドダンプ,および性能解析トレースファイルを選びます。
    スレッドダンプと性能解析トレースファイルが出力された時刻を基に,調査に使用するスレッドダンプ,および性能解析トレースファイルを選びます。出力された時刻は,次の情報を参考にしてください。
    スレッドダンプ
    ファイル名,およびファイルの末尾に出力される時刻
    ファイルの末尾に出力される時刻の例を次に示します。

     :
     :
    Full thread dump completed.   Fri Jul 21 19:22:47 2006

    性能解析トレースファイル
    「Time」および「Time(msec/usec/nsec)」
    性能解析トレースファイルの「Time」および「Time(msec/usec/nsec)」の例を次の図に示します。
    [図データ]
  3. スレッドダンプの「nid」(16進数)または「jid」(16進数)を10進数に変換します。
    • Windows,AIX,HP-UXおよびSolarisの場合
      スレッドダンプの「nid」(16進数)を10進数に変換します。

       :
       :
      "VBJ ThreadPool Worker" daemon prio=5 jid=0x00054f93 tid=0x04cef380 nid=0x1124 in Object.wait() [0x0632f000..0x0632fd18]
       stack=[0x06330000..0x062f5000..0x062f1000..0x062f0000]
       [user cpu time=0ms, kernel cpu time=15ms] [blocked count=1, waited count=29]
      at java.lang.Object.wait(Native Method)
       :
       :

      1124(16進数)=4388(10進数)


    • Linuxの場合
      スレッドダンプの「jid」(16進数)を10進数に変換します。

       :
       :
      "main" prio=1 jid=0x00006d75 tid=0x00201d70 nid=0x1e51 waiting on condition [0x00000000..0xbfe80488]  stack=[0xbfe87000..0xbfc8c000..0xbfc88000..0xbfc87000]   [user cpu time=1320ms, kernel cpu time=4280ms] [blocked count=5, waited count=4]
       :
       :

      6d75(16進数)=28021(10進数)


  4. 性能解析トレースファイルの「Thread(hashcode)」の値(10進数)が手順3.で10進数に変換した値と一致する行を探して,トレース情報を特定します。
    • Windows,AIX,HP-UXおよびSolarisの場合
      Thread(スレッドID)の値が,10進数に変換した値と一致する行を探します。

      [図データ]

    • Linuxの場合
      hashcode(ハッシュコード)の値が,10進数に変換した値と一致する行を探します。

      [図データ]

(3) Explicitヒープ詳細情報の出力内容

Explicitヒープ詳細情報には,Explicitヒープ情報およびExplicitメモリブロック情報が出力されます。Explicitメモリブロック情報は,Explicitメモリブロックが一つ以上ある場合に,その個数分出力されます。Explicitメモリブロック情報には,Explicitメモリブロック内のオブジェクト統計情報も出力されます。

Explicitヒープ詳細情報の出力形式,出力項目および出力例を次に示します。

出力形式
eheapprofコマンドを実行しているかどうかによって出力形式が異なります。
  • eheapprofコマンドを実行している場合

    Explicit Heap Status
    --------------------
    max <EH_MAX>, total <EH_TOTAL>, used <EH_USED>, garbage <EH_GARB> (<EH_PER1> used/max, <EH_PER2> ¥
    used/total, <EH_PER3> garbage/used), <EM_NUMS> spaces exist

    Explicit Memories(<EM_MGR_PTR>)
    ...
     "<EM_NAME>" eid=<EID>(<EM_PTR>)/<EM_TYPE>, total <EM_TOTAL>, used <EM_USED>, garbage <EM_GARB> ¥
    (<EM_PER1> used/total, <EM_PER2> garbage/used, <FL_BLOCKS> blocks) <EM_STAT>
       deployed objects
       ________________Size__Instances__Class________________
                    <ISIZE>     <INUM> <CNAME>
                    ...
                    <AISIZE>    <AINUM> total
    ...

    注 出力形式で使用している記号については,「5.11.2(3) イベントログの出力形式の説明で使用する記号」を参照してください。


  • eheapprofコマンドを実行していない場合

    Explicit Heap Status
    --------------------
    max <EH_MAX>, total <EH_TOTAL>, used <EH_USED>, garbage <EH_GARB> (<EH_PER1> used/max, <EH_PER2> ¥
    used/total, <EH_PER3> garbage/used), <EM_NUMS> spaces exist

    Explicit Memories(<EM_MGR_PTR>)
    ...
     "<EM_NAME>" eid=<EID>(<EM_PTR>)/<EM_TYPE>, total <EM_TOTAL>, used <EM_USED>, garbage <EM_GARB> ¥
    (<EM_PER1> used/total, <EM_PER2> garbage/used, <FL_BLOCKS> blocks) <EM_STAT>
    ...

    注 出力形式で使用している記号については,「5.11.2(3) イベントログの出力形式の説明で使用する記号」を参照してください。


出力項目
出力形式で示した各項目について説明します。

表5-22 出力項目(Explicitヒープ詳細情報)

分類出力項目出力内容意味
Explicitヒープ情報<EH_MAX><const>KExplicitヒープの最大サイズが出力されます。単位はキロバイトです。
<EH_TOTAL><const>K確保済みExplicitヒープサイズが出力されます。単位はキロバイトです。
<EH_USED><const>K利用済みExplicitヒープサイズが出力されます。単位はキロバイトです。
<EH_GARB><const>KExplicitヒープの内部状態が出力されます。
<EH_PER1><decimal>%Explicitヒープ利用率(<EH_USED>/<EH_MAX>)が%表記で出力されます。
<EH_PER2><decimal>%Explicitヒープ利用率(<EH_USED>/<EH_TOTAL>)が%表記で出力されます。
<EH_PER3><decimal>%Explicitヒープの内部状態が出力されます。
<EM_NUMS><const>有効なExplicitメモリブロックの数が出力されます。
<EM_MGR_PTR><ptr>Explicitヒープ制御のための内部情報があるメモリアドレスが出力されます。障害調査時などに利用します。
Explicitメモリブロック情報<EM_NAME><letters>Explicitメモリブロックの名称が出力されます。
Explicitメモリブロックの名称に多バイト文字が含まれている場合,出力内容は不定です(通常は文字化けして出力されます)。
Explicitメモリブロックの初期化とほぼ同時に出力された場合や,JavaVMが内部で生成したExplicitメモリブロックの場合は,"NULL"が出力されることがあります。
<EID><const>ExplicitメモリブロックのIDが出力されます。
<EM_PTR><ptr>Explicitメモリブロック内部構造があるメモリアドレスが出力されます。障害調査時などに利用します。
<EM_TYPE>R|B|AExplicitの種別が出力されます。Rは,アプリケーションサーバの内部で利用されているExplicitメモリブロックを示します。Bは,アプリケーションが利用しているExplicitメモリブロックを示します。Aは,自動配置設定ファイルを使って指定したExplicitメモリブロックを示します。
<EM_TOTAL><const>KExplicitメモリブロックのメモリ確保済みサイズが出力されます。単位はキロバイトです。
<EM_USED><const>KExplicitメモリブロックの利用済みサイズが出力されます。単位はキロバイトです。
<EM_GARB><const>KExplicitメモリブロックの内部状態が出力されます。単位はキロバイトです。
<EM_PER1><decimal>%Explicitメモリブロック利用率(<EM_USED>/<EM_TOTAL>)が%表記で出力されます。
<EM_PER2><decimal>%Explicitメモリブロックの内部状態が出力されます。
<FL_BLOCKS><const>常に0が出力されます。
<EM_STAT>Enable|DisableExplicitメモリブロックのサブ状態が出力されます。
オブジェクト統計情報<ISIZE><const>あるクラスをインスタンス化したオブジェクトのExplicitメモリブロック内のサイズが出力されます。
<INUM><const>あるクラスをインスタンス化したオブジェクトのExplicitメモリブロック内の個数が出力されます。
<CNAME><letters><ISIZE>および<INUM>が示すクラスの完全クラス名が出力されます。
<AISIZE><const>Explicitメモリブロック内の全オブジェクトの合計サイズが出力されます。
<AINUM><const>Explicitメモリブロック内の全オブジェクトの個数が出力されます。

注 出力内容で使用している記号については,「5.11.2(3) イベントログの出力形式の説明で使用する記号」を参照してください。

注※ オブジェクト統計情報は,eheapprofコマンドを実行している場合に出力されます。なお,オブジェクト統計情報には,実際に作成したサイズ,個数よりも多く,int型配列を示す"[I"が出力されることがあります。この場合,"[I"は,Explicitメモリブロック内で使用されていないオブジェクトを示します。Explicitメモリブロック内で使用されていないオブジェクトは,JavaVMの内部処理でint型配列化されます。


出力例
eheapprofコマンドを実行しているかどうかによって出力形式が異なります。
  • eheapprofコマンドを実行している場合

    Explicit Heap Status
    --------------------
    max 31415926K, total 162816K, used 150528K, garbage 10004K (0.0% used/max, 91.1% used/total, 6.6% garbage/used), 3 spaces exist

    Explicit Memories(0x12345678)

     "EJBMgrData" eid=1(0x02f25610)/R, total 54272K, used 50176K, garbage 0K (91.2% used/total, 0.0% garbage/used, 0 blocks)
       deployed objects
       ________________Size__Instances__Class________________
                   35234568      10648 java.util.HashMap
                    5678900      10668 [Ljava.util.HashMap$Entry;
                    4456788       7436 java.util.HashMap$Entry
                    4321000        200 java.util.WeakHashMap
                    1234568        190 [Ljava.util.WeakHashMap$Entry
                     454400          4 java.util.WeakHashMap$Entry
                   51380224      29146 total

     "VJBStored" eid=3(0x02f25910)/B, total 54272K, used 50176K, garbage 10004K (90.7% used/total, 19.9% garbage/used, 5 blocks)
       deployed objects
       ________________Size__Instances__Class________________
                   35234568      10648 java.util.HashMap
                    5678900      10668 [Ljava.util.HashMap$Entry;
                    4456788       7436 java.util.HashMap$Entry
                    4321000        200 java.util.WeakHashMap
                    1234568        190 [Ljava.util.WeakHashMap$Entry
                     454400          4 java.util.WeakHashMap$Entry
                   51380224      29146 total

     "ExplicitMemory-2" eid=2(0x02f25700)/B, total 54272K, used 50176K,  garbage 0K (91.1% used/total, 0.0% garbage/used, 0 blocks)
       deployed objects
       ________________Size__Instances__Class________________
                   35234568      10648 java.util.HashMap
                    5678900      10668 [Ljava.util.HashMap$Entry;
                    4456788       7436 java.util.HashMap$Entry
                    4321000        200 java.util.WeakHashMap
                    1234568        190 [Ljava.util.WeakHashMap$Entry
                     454400          4 java.util.WeakHashMap$Entry
                   51380224      29146 total

  • eheapprofコマンドを実行していない場合

    Explicit Heap Status
    --------------------
    max 31415926K, total 213971K, used 205369K, garbage 1234K (1.1% used/max, 96.2% used/total, 0.0% garbage/used), 3 spaces exist

    Explicit Memories(0x12345678)

     "EJBMgrData" eid=1(0x02f25610)/R, total 154272K, used 150176K, garbage 1234K (97.0% used/total, 1.2% garbage/used, 0 blocks) Enable

     "VJBStored" eid=3(0x02f25910)/B, total 54272K, used 50176K, garbage 0K (90.9% used/total, 0.0% garbage/used, 2 blocks) Enable

     "ExplicitMemory-2" eid=2(0x02f25700)/R, total 5427K, used 5017K, garbage 0K (92.1% used/total, 0.0% garbage/used, 0 blocks) Enable