Cosminexus アプリケーションサーバ V8 機能解説 保守/移行/互換編

[目次][用語][索引][前へ][次へ]

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モニタダンプ※1 Java内部で使われるモニタ情報の一覧を出力します。Row monitorが使用された場合だけ出力されます。
JNIグローバル参照情報※2 JavaVMが保持している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>K Explicitヒープの最大サイズが出力されます。単位はキロバイトです。
<EH_TOTAL> <const>K 確保済みExplicitヒープサイズが出力されます。単位はキロバイトです。
<EH_USED> <const>K 利用済みExplicitヒープサイズが出力されます。単位はキロバイトです。
<EH_GARB> <const>K Explicitヒープの内部状態が出力されます。
<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|A Explicitの種別が出力されます。Rは,アプリケーションサーバの内部で利用されているExplicitメモリブロックを示します。Bは,アプリケーションが利用しているExplicitメモリブロックを示します。Aは,自動配置設定ファイルを使って指定したExplicitメモリブロックを示します。
<EM_TOTAL> <const>K Explicitメモリブロックのメモリ確保済みサイズが出力されます。単位はキロバイトです。
<EM_USED> <const>K Explicitメモリブロックの利用済みサイズが出力されます。単位はキロバイトです。
<EM_GARB> <const>K Explicitメモリブロックの内部状態が出力されます。単位はキロバイトです。
<EM_PER1> <decimal>% Explicitメモリブロック利用率(<EM_USED>/<EM_TOTAL>)が%表記で出力されます。
<EM_PER2> <decimal>% Explicitメモリブロックの内部状態が出力されます。
<FL_BLOCKS> <const> 常に0が出力されます。
<EM_STAT> Enable|Disable Explicitメモリブロックのサブ状態が出力されます。
オブジェクト統計情報 <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