ページの先頭行へ戻る
Interstage Application Server V12.0.0 トラブルシューティング集
FUJITSU Software

A.2 jheap

jheapは、実行中のJavaプログラムのヒープ使用状況を出力するツールです。

動作環境

サポート対象のJDK/JRE

製品添付のJDK/JRE

サポート対象のガーベジコレクション(GC)

FJVMがサポートする次のGC処理が動作対象のGC処理です。

  • シリアルGC

  • パラレルGC

  • CMS付きパラレルGC

上記以外のGC処理に対しては、jheapは動作しません。
FJVMがサポートするGC処理の詳細は、“チューニングガイド”の“JDK/JRE 7のチューニング”、および“JDK/JRE 8のチューニング”の“FJVMでサポートされるガーベジコレクション処理”を参照してください。

格納先

jheapは、コマンドプロンプトから起動するコマンドで、モジュール名はjheapです。
格納先は次のとおりです。

以下、製品を“C:\Interstage”にインストールした場合を想定しています。

形式

jheap [-i interval] [-c count] [-t] pid

機能説明

pidで指定した動作中のJavaプログラムのヒープ使用状況を一定時間の間隔で標準出力に出力します。
pidには、プロセスIDを指定します。
Windows(R)の場合は、プロセスIDは“タスクマネージャ”で確認することができます。

Java EE 7機能の場合、IJServerクラスタのプロセスIDの確認方法は、”Java EE 7 設計・構築・運用ガイド”を参照してください。

Enterprise EditionJava EE 6機能の場合、IJServerクラスタのプロセスIDの確認方法は、”Java EE運用ガイド(Java EE 6編)”を参照してください。

J2EE機能の場合、ワークユニットのプロセスIDは、Interstage管理コンソールのIJServerモニタ画面で参照することができます。

オプション

-i interval

測定の間隔を秒単位で指定します。省略可能です。
省略した場合は、5秒間隔で測定します。

-c count

出力する回数を指定します。省略可能です。
省略した場合は、指定したプロセスが終了するまで出力し続けます。

-t

タイムスタンプを出力する場合に指定します。省略可能です。

pid

プロセスIDを指定します。

プロセスID以外の、-i, -c ,-t オプションの指定の順序は任意です。
また、-i , -c オプションを複数回指定した場合は、最後に指定したオプションが有効となります。

“-i”および“-c”オプションには、正の整数(1~2147483647)を指定することができます。
そのとき、オプションに指定された文字列を先頭から解析し、数字以外の文字が指定された時点で解析を終了します。たとえば、“12.345”は“12”と解釈します。

使用方法

次の手順で、jheapを起動してください。

  1. jheapの格納先ディレクトリを環境変数PATHに追加するか、環境変数PATHに追加されているディレクトリにjheapを格納してください。
    または、jheap.exeをフルパスで指定して実行してください。

  2. コマンドプロンプトからjheapコマンドを起動します。

コマンド起動時の例(JDK7の場合):

----------------------------------------------------------------------
% jheap  123
<new>  [used:    847728] [free:   1511568] [total:   2359296]
<old>  [used:  33699152] [free:   2820784] [total:  36519936]
<perm> [used:   6460336] [free:     93264] [total:   6553600]
<new>  [used:    847728] [free:   1511568] [total:   2359296]
<old>  [used:  33699152] [free:   2820784] [total:  36519936]
<perm> [used:   6460336] [free:     93264] [total:   6553600]
<new>  [used:    847728] [free:   1511568] [total:   2359296]
<old>  [used:  33699152] [free:   2820784] [total:  36519936]
<perm> [used:   6460336] [free:     93264] [total:   6553600]
・・・
----------------------------------------------------------------------

解説

Javaアプリケーションのメモリ使用状況には以下があります。

プロセス全体のメモリ使用状況は、OSの機能(Windows(R)ではタスクマネージャやパフォーマンスモニタ、Solarisではpmap/prstatなど)で把握することができます。
一方、Javaヒープの使用状況は、以下で確認することができますが、プログラム起動時に指定するか、あらかじめソースコードに仕込む必要があります。

jheapは、JavaプログラムのJavaヒープの使用状況を、プログラムの起動後に調査することができます。

Javaヒープは、通常のオプションでは、JDK7まではNew世代領域、Old世代領域、Permanent世代領域の3つに大別されます。JDK8より、Permanent世代領域がメタスペースに変更になり、Javaヒープではなくなりましたが、jheapコマンドで表示することができます。jheapでは、以下のように、それぞれの領域の使用状況を検出することができます。

----------------------------------------------------------------------
<new>  [used:    847728] [free:   1511568] [total:   2359296]
<old>  [used:  33699152] [free:   2820784] [total:  36519936]
<perm> [used:   6460336] [free:     93264] [total:   6553600]

used  :現在の使用量  (byte)
free  :現在の空き容量(byte)
total :現在の領域長  (byte)
----------------------------------------------------------------------

これら3つの領域は、newなどによるメモリ確保、ガーベジコレクションなどにより、増減します。totalは、現在メモリがマッピングされている量であり、最大値ではないことに注意が必要です。
new + oldで、-verbose:gcで表示される情報に相当します。
New世代領域、Old世代領域ともに、Javaクラスのインスタンスが格納される領域です。
New世代領域には、newされてからの時間が比較的短いインスタンスが格納されます。
Old世代領域には、newされてからの時間が比較的長いインスタンスがガーベジコレクションにより、New世代領域から移動されます。
Permanent世代領域(JDK7まで)およびメタスペース(JDK8以降)は、標準のJavaの機能で測定することはできませんが、Javaのクラスや定数などの不変な情報が格納される領域です。Javaプログラムで使用するクラスの種類が多かったり、クラスのサイズが大きかったりする場合に不足する場合があります。
記録された値を元に、ヒープ域の使用状況と実際の処理の経過時間とを比較し、繁忙時のヒープの使用状況を確認できます。もし結果がヒープ域の最大値に近接した値であれば、ヒープ域の最大値を拡張し、余裕を持たせる必要があります。

注意

ServletやEJBなどのサーバアプリケーションの測定をするためには、Administrator権限でjheapを実行する必要があります。

また、Administratorグループのメンバーにより、管理者権限で実行したコマンドプロンプトからjheapを実行する必要があります。
管理者権限でコマンドプロンプトを実行するには、コマンドプロンプトの実行ファイルをエクスプローラー上で右クリックし、“管理者権限で実行する”を選択します。

測定対象のプロセスに対して、プロセスの読込み権が必要です。
ServletやEJBなどのサーバアプリケーションの測定をするためには、通常rootでjheapを実行する必要があります。