図1のオプションを指定したJavaプロセスに対してスレッドダンプ出力の操作を行った場合、スレッドダンプの出力に続いて、Javaヒープ内に生存する各クラスのインスタンス情報が図2の形式で出力されます。FJVMでは、当該機能を「クラスのインスタンス情報出力機能」として実装しています。
クラスのインスタンス情報として、クラス毎のインスタンス数および合計サイズが出力されるため、Javaヒープ内におけるメモリリークなどの調査で利用することができます。
クラスのインスタンス情報の出力先は、標準出力です。クラスのインスタンス情報が出力される契機および出力先は、“8.5.3 スレッドダンプ”が出力される契機および出力先と同じです。
なお、-Xloggcオプションの指定がある場合は、クラスのインスタンス情報の出力先が標準出力から-Xloggcオプションで指定したファイルへ切り替わります。
図1 スレッドダンプに続いて、クラスのインスタンス情報を出力する機能を有効にするオプション
-XX:+PrintClassHistogram |
図2 クラスのインスタンス情報の出力形式
num #instances #bytes class name ---------------------------------------------- $1: $2 $3 $4 : (略) : Total $5 $6 |
図2の各要素について、以下で説明します。
$1: 順位
クラスのインスタンス情報は、各クラスのインスタンスの合計サイズが大きい順に、ソートされて出力されます。
$2: クラスのインスタンス数
$3: クラスのインスタンスの合計サイズ
$4: クラス名
$5: $2の値の合計
$5: $3の値の合計
クラスのインスタンス情報出力機能では、不要なインスタンスを排除した後の情報を採取・出力します。そのため、事前処理としてFullGCを実行します。クラスのインスタンス情報出力の過度の使用は、FullGCの多発となるので注意してください。
クラスのインスタンス情報出力に先立って行われるはずのFullGCが、ガーベジコレクション処理の実行抑止により実行できない状態にある場合は、図3のメッセージを標準出力へ出力した後、クラスのインスタンス情報出力の要求は取り消されます。
図3 クラスのインスタンス情報出力要求が取り消された場合に出力されるメッセージ
The PrintClassHistogram operation was canceled because GC could not be run. |