FJVMでは、“-verbose:gc”オプション指定時にガーベジコレクション(GC)処理の結果ログを出力する「ガーベジコレクション処理の結果ログ出力機能」の強化を行っています。
“-verbose:gc”オプションを指定してGC処理の結果ログを出力する際、図1のオプションを追加指定することにより、GC処理の結果ログとして出力される情報が、図2に示す形式に拡張されます。また、図3に出力例を示します。
図1 GC処理の結果ログとして出力される情報を拡張するオプション
-XX:+UseFJverbose |
図2 GC処理の結果ログとして出力される情報の拡張形式
$1: [$2, [$3 : $4->$5($6)], [$7 : $8->$9($10)] $11->$12($13), [$14 : $15->$16($17)], $18 secs] |
図2の各要素について、以下で説明します。
$1: 経過時間
GC処理の実行開始時間をJava VMが起動されてからの経過時間(秒)で示します。
$2: GC種別
実行したGC処理の種別を以下の名称で示します。
GC
New世代領域を対象とするGC処理(NewGC処理またはマイナーGC処理)における結果情報です。
Full GC
Javaヒープ域全体(メモリ割り当てプール(New世代領域、Old世代領域)およびPermanent世代領域)を対象とするGC処理(FullGC処理)における結果情報です。
Full GC*
使用されているGC処理がシリアルGCまたはFJGCの場合で、かつ、直前に実行されたNewGC処理では十分な空き領域が確保できず、そのNewGC処理に続けて実行されたFullGC処理における結果情報です("Full GC"の後に"*"の付く表示になります)。
なおこの名称は“-verbose:gc”オプションだけを指定した場合には出力されません(単に"Full GC"として出力されます)。
$3: New世代領域の識別名
New世代領域の識別名を示します。
使用されているGC処理の違いにより、以下の識別名が出力されます。
DefNew: シリアルGCの場合
SplitEden: FJGCの場合
PSYoungGen: パラレルGCの場合
$4: GC処理前のオブジェクト量(New世代領域)
GC処理実行前のNew世代領域に存在したオブジェクトの総量(バイト)です。
$5: GC処理後のオブジェクト量(New世代領域)
GC処理実行後のNew世代領域に存在するオブジェクトの総量(バイト)です。
$6: New世代領域の大きさ
New世代領域の大きさ(バイト)です。
注)使用されているGC処理がシリアルGCまたはパラレルGCの場合は、この大きさに「to space」領域の大きさが含まれません。
(シリアルGCまたはパラレルGCの場合、GC処理はNew世代領域を「eden space」、「from space」および「to space」の3つの内部領域に細分割して制御しています。)
$7: Old世代領域の識別名
Old世代領域の識別名を示します。
使用されているGC処理の違いにより、以下の識別名が出力されます。
Tenured: シリアルGCの場合
Tenured: FJGCの場合
PSOldGen: パラレルGCの場合
$8: GC処理前のオブジェクト量(Old世代領域)
GC処理実行前のOld世代領域に存在したオブジェクトの総量(バイト)です。
$9: GC処理後のオブジェクト量(Old世代領域)
GC処理実行後のOld世代領域に存在するオブジェクトの総量(バイト)です。
$10: Old世代領域の大きさ
Old世代領域の大きさ(バイト)です。
$11: GC処理前のオブジェクト量(メモリ割り当てプール)
GC処理実行前のメモリ割り当てプールに存在したオブジェクトの総量(バイト)です。
$4+$8の値です。
$12: GC処理後のオブジェクト量(メモリ割り当てプール)
GC処理実行後のメモリ割り当てプールに存在するオブジェクトの総量(バイト)です。
$5+$9の値です。
$13: メモリ割り当てプールの大きさ
メモリ割り当てプールの大きさ(バイト)です。
$6+$10の値です。
注)使用されているGC処理がシリアルGCまたはパラレルGCの場合は、この大きさにNew世代領域の「to space」領域の大きさが含まれません。
(シリアルGCまたはパラレルGCの場合、GC処理はNew世代領域を「eden space」、「from space」および「to space」の3つの内部領域に細分割して制御しています。)
$14: Permanent世代領域の識別名
Permanent世代領域の識別名です。
使用されているGC処理の違いにより、以下の識別名が出力されます。
Perm: シリアルGCの場合
Perm: FJGCの場合
PSPermGen: パラレルGCの場合
$15: GC処理前のオブジェクト量(Permanent世代領域)
GC処理実行前のPermanent世代領域に存在したオブジェクトの総量(バイト)です。
$16: GC処理後のオブジェクト量(Permanent世代領域)
GC処理実行後のPermanent世代領域に存在するオブジェクトの総量(バイト)です。
$17: Permanent世代領域の大きさ
Permanent世代領域の大きさ(バイト)です。
$18: GC処理実行時間
GC処理実行に要した時間(秒)です。
$2、$11、$12、$13、および$18に対する出力情報は、GC処理の結果ログ出力機能として“-verbose:gc”オプションだけを指定した際に出力される情報と対応します。
有効なGC処理
このオプション指定により出力形式が拡張されるのは、使用するGC処理が以下の場合です。
シリアルGC
FJGC(JDK/JRE 1.4、5.0)
パラレルGC (JDK/JRE 5.0、6)
クラスのアンロード情報
Javaアプリケーションがクラスのアンローディング処理を行なっていた場合には、FullGC処理中に該当するクラスのアンロード情報”[Unloading class アンロードされたクラス名]”が出力の途中に挿入される場合があります.
ガーベジコレクション処理の結果ログに対するクラスのアンロード情報出力を抑止する場合は、次のオプションを指定してください。
GC処理の結果ログに対するクラスのアンロード情報出力を抑止するオプション
-XX:-ClassUnloadingInfo
ログ出力量の増加
本オプションの指定により、ログ出力が増大します。
本オプションを指定する場合は、ログ出力量についての注意が必要です。
■ ログの見方
図3に、GC処理の結果ログとして出力される情報の拡張形式の出力例を示します。
図3 GC処理の結果ログとして出力される情報の拡張形式の出力例
1.495: [Full GC*, [SplitEden : 384K->0K(704K)], [Tenured : 47835K->32752K(47872K)] 48219K->32752K(48576K), [Perm : 4081K->4081K(16384K)], 0.6623532 secs] |
この出力情報から、以下のことが分かります。
Java VMが起動されてから1.495秒後にFullGC処理が実行された。
使用されているGC処理はFJGCである。
GC処理後のNew世代領域の大きさは704KBである。
GC処理により、New世代領域に存在するオブジェクト量は384KBから0KBになった。
(不要オブジェクトが削除され、また必要に応じてOld世代領域へ生存オブジェクトが移動した)
GC処理後のOld世代領域の大きさは47872KBである。
GC処理により、Old世代領域に存在するオブジェクト量は47835KBから32752KBになった。
(不要オブジェクトが削除され、また必要に応じてNew世代領域から生存オブジェクトが移動してきた)
GC処理後のメモリ割り当てプールの大きさは48576KBである。
GC処理により、メモリ割り当てプールに存在するオブジェクト総量は48219KBから32752KBになった。
(不要オブジェクトが削除された)
GC処理後のPermanent世代領域の大きさは16384KBである。
GC処理により、Permanent世代領域に存在するオブジェクト量は変化していない。
GC処理に要した時間は0.6623532秒である。