Java監視機能が画面に表示、あるいはファイルに保存するデータの形式について説明します。
■メソッドサンプリング
メソッドサンプリング機能を操作した際に画面(結果の表示域)に表示されるデータの形式やファイル出力したCSV形式について説明します。
◆画面表示されたデータ形式
メソッドサンプリングの結果の表示例を以下に示します。
なお、ロギング機能の指定によりロギングファイルに採取された情報は、画面表示されたメソッドサンプリング結果と同じです。
ロギングファイルに採取された情報は、本説明を参照してください。
メソッドサンプリングの結果は、[スタックトレース]と[サンプリング情報]の2種類のデータで構成されます。
スタックトレース
例の中で、次の部分を示します。
スタックトレースの形式は、以下の形式をしています。
[スタックトレースの形式]
スタックトレース番号: メソッド名情報1(ソース名:行番号) メソッド名情報2(ソース名:行番号) メソッド名情報3(ソース名:行番号) : : メソッド名情報N(ソース名:行番号)
[スタックトレースを構成する各データの説明]
スタックトレース番号 | スタックトレースごとに付けられた番号です。この番号は、サンプリング情報の“trace”項目と一致します。番号の前に“TRACE ”という文字列が付きます。 |
メソッド名情報1~N | スタックトレースを構成するメソッド名です。 |
ソース名 | メソッド名に示されたメソッドがプログラミングされたjavaのソースコードファイル名です。ファイル名は、“SocketInputStream.java”などと示された部分です。 |
行番号 | ソース名に示されたソースコードファイル中、そのメソッドが記述された行番号です。行番号は、ソース名の後ろで“:”で区切られています。例中の“129”などと示された部分です。行番号が不明な場合“Unknown line”と示されます。 |
サンプリング情報
例の中で、次の部分を示します。
サンプリング期間にメソッドがサンプリングされた回数のランクを示した情報です。
出力される情報は、サンプリング期間内において、サンプリング数の比率が0.1%以上のものです。
サンプリング期間について
サンプリング期間とは、メソッドサンプリングの結果として画面に表示される情報の対象範囲のことです。
上の図で、1回目(▲1)に画面に表示したデータのサンプリング期間は、メソッドサンプリング開始から1回目のサンプリング(▽1)までが相当します。
同様に、2回目(▲2)のサンプリング期間は、メソッドサンプリング開始から3回目のサンプリング(▽3)までが相当します。
サンプリング情報は、以下の形式をしています。
[サンプリング情報の形式]
開始見出し データ項目名 サンプリング情報1 サンプリング情報2 : サンプリング情報N 終了見出し
[サンプリング情報を構成する各データの説明]
開始見出し | サンプリング情報開始を示す行です。
|
データ項目名 | サンプリング情報のデータ項目の並びを示しています。 |
サンプリング情報1~N | サンプリングされたメソッドごとのサンプリング結果です。 |
終了見出し | サンプリング情報の終わりを示す行です。 |
[データ項目の説明]
データ項目名 | 意味 |
---|---|
Rank | サンプリング期間内に該当メソッド(“method”項目が示すメソッド)がサンプリングされた回数の順位です。 |
Self | 総サンプリング数に対する、該当メソッド(“method”項目が示すメソッド)のサンプリング数の比率です。 |
Accum | 総サンプリング数に対する、サンプリング数の累積比率です。 |
Count | サンプリング期間内に該当メソッド(“method”項目が示すメソッド)がサンプリングされた回数です。 |
Trace | 該当メソッド(“method”項目が示すメソッド)に対応するスタックトレースの番号です。 |
Method | サンプリングされたメソッド名です。 |
◆ファイル保存されたCSV形式
メソッドサンプリングの結果を[CSV形式で保存する]ボタンを押してファイルへ保存した、ファイル形式の説明をします。
メソッドサンプリングをファイルへ保存した場合は、ファイルの内容は画面上に見えている現在のメソッドサンプリングの結果をカンマ(“,”)区切りしたもので、[スタックトレース]と[サンプリング情報]の2種類のデータで構成されます。
スタックトレース
たとえば、画面上、次のスタックトレースが表示されていたとします。
この場合、次のようなデータになります。
"TRACE","300004:" ,"java.net.SocketInputStream.socketRead0(SocketInputStream.java:Unknown line)" ,"java.net.SocketInputStream.read(SocketInputStream.java:129)" ,"java.io.BufferedInputStream.fill(BufferedInputStream.java:218)" ,"java.io.BufferedInputStream.read(BufferedInputStream.java:235)" "TRACE","300002:" ,"sun.nio.ch.DevPollArrayWrapper.poll0(DevPollArrayWrapper.java:Unknown line)" ,"sun.nio.ch.DevPollArrayWrapper.poll(DevPollArrayWrapper.java:164)" ,"sun.nio.ch.DevPollSelectorImpl.doSelect(DevPollSelectorImpl.java:68)" ,"sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)" "TRACE","300001:" ,"java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java:Unknown line)" ,"java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)" ,"java.net.ServerSocket.implAccept(ServerSocket.java:450)" ,"java.net.ServerSocket.accept(ServerSocket.java:421)" "TRACE","300003:" ,"java.net.PlainDatagramSocketImpl.receive0(PlainDatagramSocketImpl.java:Unknown line)" ,"java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)" ,"java.net.DatagramSocket.receive(DatagramSocket.java:712)" ,"net.jxta.impl.endpoint.mcast.McastTransport.run(McastTransport.java:579)" "TRACE","300006:" ,"java.net.SocketInputStream.socketRead0(SocketInputStream.java:Unknown line)" ,"java.net.SocketInputStream.read(SocketInputStream.java:129)" ,"com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)" ,"com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)"
サンプリング情報
たとえば、画面上、次のサンプリング情報が表示されていたとします。
この場合、次のようなデータになります。
"CPU SAMPLES BEGIN (total = 9268) Tue Jul 29 11:35:17 2008" "rank","self","accum","count","trace","method" "1","39.15%","39.15%","3628","300004","java.net.SocketInputStream.socketRead0" "2","25.47%","62.62%","2361","300002","sun.nio.ch.DevPollArrayWrapper.poll0" "3","25.47%","90.09%","2361","300001","java.net.PlainSocketImpl.socketAccept" "4","8.49%","98.59%","787","300003","java.net.PlainDatagramSocketImpl.receive0" "5","0.83%","99.42%","77","300006","java.net.SocketInputStream.socketRead0" "CPU SAMPLES END"
各データ項目の意味は、“◆画面表示されたデータ形式”を参照してください。
◆ロギングファイル
ロギング機能を利用してメソッドサンプリングの結果を保存した際のロギングファイルの説明をします。
ロギングファイルは、次のファイル名の命名規約により決定し、作成されます。
[ロギングファイル名]
${ログファイル格納ディレクトリ}\sampling_${hostname}_${pid}_${date-time}.log
[ロギングファイル名の説明]
${ログファイル格納ディレクトリ} | ログファイルが格納されるディレクトリです。 |
sampling | メソッドサンプリングのロギングファイルであることを示す、接頭文字列です。 |
_ | 固有文字列とホスト名の間にセパレータ文字として“_”が入ります。 |
${hostname} | 監視対象としているJavaプロセスが動作しているホスト名です。 |
_ | ホスト名とプロセスIDの間にセパレータ文字として“_”が入ります。 |
${pid} | 監視対象としているJavaプロセスのプロセスIDです。 |
_ | プロセスIDとロギングファイルの作成日の間にセパレータ文字として“_”が入ります。 |
${data-time} | ロギングファイルの作成日時です。“yyyyMMDDhhmmss”の形式をしています。 yyyy-西暦(4桁で示します) |
.log | 固定文字列です。 |
ロギングファイルは、メソッドサンプリングの結果書き込みを行う前にファイルサイズの確認を行います。結果の書き込みによりファイルサイズが、2Gバイトを超えることを検出すると新たにファイルを作成し、新しいファイルに結果の書き込みを行います。(このファイル切り替えをファイルローテーションと呼びます)
ファイルローテーションが起こった場合、ロギングファイルの世代をファイル名中の“${data-time}”の部分で知ることができます。
ロギングのタイミング
メソッドサンプリング結果のロギングは、[開始]ボタンから[停止]ボタンまでの間、画面にメソッドサンプリング結果が表示されるごとにファイルへ追書きします。[一時停止]ボタンを押している間は、記録の追書きは行われません。
■オブジェクトヒストグラム
ヒープ分析のオブジェクトヒストグラム機能を操作した際に画面(結果の表示域)に表示されるデータの形式とファイル出力したCSV形式について説明します。
◆画面表示されたデータ形式
オブジェクトヒストグラムの結果の表示例を以下に示します。
オブジェクトヒストグラムは、Javaヒープ上のオブジェクトを、クラス名ごとにサイズおよび個数の総和を開始点と終了点それぞれで求め、終了点の総和から開始点の総和を引いた値を示したものです。
開始点および終了点は、“開始時刻”([開始]ボタンを押したとき)と“終了時刻”([終了]ボタンを押したとき)に示された時刻になります。
オブジェクトヒストグラムの結果は、次の順番でソートされ表示されます。
終了点の総和から開始点の総和を引いたオブジェクトサイズが大きなもの
1の条件が同値のものが存在した場合、個数の大きなもの
2の条件が同値のものが存在した場合、オブジェクトヒストグラム検出順
オブジェクトヒストグラムの結果は、次のデータで構成されます。
開始時刻 | オブジェクトヒストグラムの情報収集を開始した時刻です。 |
終了時刻 | オブジェクトヒストグラムの情報収集を終了した時刻です。 |
データ項目名 | オブジェクトヒストグラムの結果に表示されているデータの項目名を示した行です。 |
結果1~N | 終了点から開始点を引いた結果です。 |
◆ファイル保存されたCSV形式
オブジェクトヒストグラムの結果を[CSV形式で保存する]ボタンを押してファイルへ保存した、各行の説明をします。
オブジェクトヒストグラムをファイルへ保存した場合は、ファイルの内容は画面上に見えている現在のオブジェクトヒストグラムの結果をカンマ(“,”)区切りしたものです。
たとえば、画面上、次のオブジェクトヒストグラムの結果が表示されていたとします。
この場合、次のようなデータになります。
"開始時刻","Wed Jul 30 10:53:24 JST 2008" "終了時刻","Wed Jul 30 10:58:07 JST 2008" "増減[バイト]","増減[個数]","クラス名" "411320","42","char[]" "298448","293","byte[]" "19968","48","sun.misc.CacheEntry[]" "9224","23","<methodDataKlass>" "2880","90","java.lang.ref.Finalizer" "2304","36","sun.security.provider.MD5" "1632","12","com.sun.net.ssl.internal.ssl.SSLSocketImpl" "1536","24","sun.security.pkcs11.P11Cipher" "1344","24","javax.crypto.Cipher" "1152","48","sun.misc.Cache" "1152","48","java.security.MessageDigest$Delegate" "1152","28","java.util.Hashtable$Entry[]" "1152","24","sun.security.pkcs11.P11Key$P11SecretKey" "1152","24","com.sun.net.ssl.internal.ssl.MAC" "1144","13","com.sun.net.ssl.internal.ssl.SSLSessionImpl" "1120","28","java.util.HashMap" "1080","45","java.lang.String" "1080","9","java.net.SocksSocketImpl" : [以下、省略] :
各データ項目の意味は、“◆画面表示されたデータ形式”を参照してください。
◆ヒープダンプ
ヒープ分析の[ダンプを取得する]ボタンを押した場合、Java監視機能が測定対象としているコンテナが動作しているアプリケーションサーバ上に、ヒープダンプと呼ばれる現在のJavaヒープのイメージをファイルとして採取します。
このヒープダンプのファイルは、次のファイルパスおよびファイル名の命名規約により決定し、作成されます。
[ヒープダンプファイルのファイルパス]
/${tmpdir}/fjvm-heapdump.${pid}.${data-time}
[ヒープダンプファイル名の説明]
/${tmpdir} | Java監視機能のヒープダンプ出力用フォルダです。 |
fjvm-heapdump | ファイル名の接頭文字列です。“fjvm-heapdump”固有の文字列を用います。 |
. | 固有文字列とPIDの間にセパレータ文字として“.”(ピリオド)が入ります。 |
${pid} | 測定対象のサーバ上でのプロセスIDです。 |
. | PIDとヒープダンプ採取日時の間にセパレータ文字として“.”(ピリオド)が入ります。 |
${data-time} | ヒープダンプ採取の日時です。 |
ヒープダンプが採取された場合、ヒープ分析の画面上には以下のようにファイルパスが示されます。
ヒープダンプ採取の留意事項
“ヒープ分析”画面の[ダンプを採取する]ボタンは、ヒープダンプ採取の操作を提供します。
Java監視機能の画面(“ヒープ分析”)上でヒープダンプを解析することはできません。また、ヒープダンプを採取したサーバからJava監視機能が動作している端末上に、ヒープダンプのファイルをファイル転送することもできません。