4.2.4 javagc
GCの強制発生
書式
javagc [-i|-f] [-v] [-s] [-ehgc] -p プロセスID
格納先
Application Serverインストールディレクトリー\jdk\jre\bin\
機能
メモリーリーク、システム障害およびアプリケーションのデバッグのために、プロセスIDがプロセスIDのjavaプロセスに対して、任意のタイミングでFullGCを発生させます。また、プロセスIDがプロセスIDのjavaプロセスに対して、任意のタイミングでFullGCと、Explicitメモリーブロックの解放を実行します。
javaプロセスとの通信にはSIGQUITシグナルを使用します。コマンドを実行すると、コマンドの処理内容をユーザーに確認します。n(発生させない、実行しない、または送信しない)と回答した場合には、コマンドの処理は実行されません(戻り値が1となります)。この確認動作は、-fオプションを指定することで省略できます。
プロセスIDのjavaプロセスが通常の要因で発生するCopyGCやFullGCを実行中の場合は、その終了を待ってからコマンドを実行します。
実行権限
引数のプロセスIDで指定するjavaプロセスと同一のユーザーで実行してください。
引数
- -i
-
次に示すコマンドの処理内容をユーザーに確認します。
-
プロセスIDのプロセスに対して、GCを発生させるかどうか
-
プロセスIDのプロセスに対して、Explicitメモリーブロックの解放を実行するかどうか
このオプションより前に指定した、-fオプションを無効にします。
-
- -f
-
次に示すコマンドの処理内容をユーザーに確認しません。
-
プロセスIDのプロセスに対して、GCを発生させるかどうか
-
Explicitメモリーブロックの解放を実行するかどうか
このオプションより前に指定した、-iオプションを無効にします。
-
- -v
-
-XX:+HitachiVerboseGCオプションの指定がなくても、Java VMログファイル作成の規則に従ってJava VMログファイルを作成して、拡張verbosegc情報を出力します。
その際、次のオプション値も反映した内容の拡張verbosegc情報を出力します。
-
-XX:+HitachiVerboseGCPrintDate
-
-XX:+HitachiVerboseGCPrintCause
-
-XX:+HitachiVerboseGCCpuTime
-
-XX:+HitachiCommaVerboseGC
-
- -s
-
標準出力に拡張verbosegc情報を出力します。
その際、次のオプション値も反映した内容の拡張verbosegc情報を出力します。
-
-XX:+HitachiVerboseGCPrintDate
-
-XX:+HitachiVerboseGCPrintCause
-
-XX:+HitachiVerboseGCCpuTime
-
-XX:+HitachiCommaVerboseGC
-
- -ehgc
-
プロセスIDがプロセスIDのjavaプロセスに対して、FullGCと、Explicitメモリーブロックの解放を実行します。
自動解放機能が有効な場合の解放処理で解放されなかったExplicitメモリーブロックを、明示的に解放できます。
まず、Java VMによってFullGCが実行され、拡張verbosegc情報にGCの要因として「EMJavaGC Command」が出力されます。そのあと、次に示すExplicitメモリーブロックが解放されます。
-
明示管理ヒープ機能の自動解放機能が有効な場合に、明示解放予約によって予約されたExplicitメモリーブロック
-
明示管理ヒープ自動配置設定ファイル、またはJava VMで生成されたExplicitメモリーブロック
-
前回の解放処理で解放されなかったExplicitメモリーブロック
また、次の場合は、解放処理が実行されません。
-
最大数の制限を超えてExplicitメモリーブロックを解放しようとした場合
現存するExplicitメモリーブロックの数が1,048,575個の場合が該当します。
-
明示管理ヒープ機能がオフになっている場合
-XX:-HitachiUseExplicitMemoryオプションが指定されている場合が該当します。
この場合、コンストラクターの実行は成功しますが、無効なExplicitメモリーブロック(ExplicitMemoryインスタンス)として扱われます。
javagcコマンドによるExplicitメモリーブロックの解放処理では、FullGCが実行されます。このため、動作中のアプリケーションに対する処理には適していません。アプリケーションのアンデプロイ時や夜間など、アプリケーションが動作していない時間帯に実行することをお勧めします。
-
- -p プロセスID
-
FullGCや、Explicitメモリーブロックの解放を実行したいプロセスIDを指定します。
型:Integer
指定できる値を次に示します。
-
0〜4294967295
-
出力形式(SerialGCの場合)
オプション"v"または"s"を指定した場合はJava VMログを出力します。
[id] <date> (Skip Full:full_count, Copy:copy_count) [gc_kind gc_info, gc_time secs][Eden: eden_info][Survivor: survivor_info][Tenured: tenured_info][Metaspace: Metaspace_info][class space: class_space_info] [cause:cause_info] [User: user_cpu secs][Sys: system_cpu secs][IM: jvm_alloc_size, mmap_total_size, malloc_total_size][TC: thread_count][DOE: doe_alloc_size, called_count][CCI: cc_used_sizeK, cc_max_sizeK, cc_infoK]
出力内容を次に説明します。
- id
-
Java VMログファイル識別子。
- date
-
GC開始日時。
-XX:-HitachiVerboseGCPrintDateオプションが指定された場合、出力されません。
- full_count
-
full GC情報出力をスキップした回数。
-XX:HitachiVerboseGCIntervalTimeオプションが指定された場合に出力されます。
- copy_count
-
copy GC情報出力をスキップした回数。
-XX:HitachiVerboseGCIntervalTimeオプションが指定された場合に出力されます。
- gc_kind
-
GC種別。「FullGC」または「GC」が出力されます。
- gc_info
-
GC情報。次の形式で出力されます。
GC前の領域長 -> GC後の領域長 (領域サイズ)
- gc_time
-
GC経過時間。
- Eden
-
エデンの種別。「DefNew::Eden」が出力されます。
- eden_info
-
Eden情報。次の形式で出力されます。
GC前の領域長 -> GC後の領域長 (領域サイズ)
- Survivor
-
Survivorの種別。「DefNew:: Survivor」が出力されます。
- survivor_info
-
Survivor情報。次の形式で出力されます。
GC前の領域長 -> GC後の領域長 (領域サイズ)
- Tenured
-
Tenuredの種別。「Tenured」が出力されます。
- tenured_info
-
Tenured情報。次の形式で出力されます。
GC前の領域長 -> GC後の領域長 (領域サイズ)
- Metaspace_info
-
Metaspace領域のメモリー情報。次の形式で出力されます。単位はキロバイトです。
<const1>K(<const2>K, <const3>K)-><const4>K(<const5>K, <const6>K)]
-
<const1>: GC前のMetaspace領域の使用サイズ
-
<const2>: GC前のMetaspace領域のcapacity サイズ
-
<const3>: GC前のMetaspace領域のcommit サイズ
-
<const4>: GC後のMetaspace領域の使用サイズ
-
<const5>: GC後のMetaspace領域のcapacity サイズ
-
<const6>: GC後のMetaspace領域のcommit サイズ
-
- class_space_info
-
class space領域のメモリー情報。次の形式で出力されます。単位はキロバイトです。
圧縮オブジェクトポインタ機能が無効の場合、出力されません。
<const1>K(<const2>K, <const3>K)-><const4>K(<const5>K, <const6>K)]
-
<const1>: GC前のclass space領域の使用サイズ
-
<const2>: GC前のclass space領域のcapacity サイズ
-
<const3>: GC前のclass space領域のcommit サイズ
-
<const4>: GC後のclass space領域の使用サイズ
-
<const5>: GC後のclass space領域のcapacity サイズ
-
<const6>: GC後のclass space領域のcommit サイズ
-
- cause_info
-
GC要因内容。
-XX:-HitachiVerboseGCPrintCauseオプションが指定された場合、出力されません。
- user_cpu
-
GCスレッドがユーザーモードで費やしたCPU時間。単位は秒です。
CPU時間取得に失敗した場合、[User: unknown]のように、「unknown」と表示されます。
-XX:-HitachiVerboseGCCpuTimeオプションが指定された場合、出力されません。
- system_cpu
-
GCスレッドがカーネルモードで費やしたCPU時間。単位は秒です。
CPU時間取得に失敗した場合、[Sys: unknown]のように、「unknown」と表示されます。
-XX:-HitachiVerboseGCCpuTimeオプションが指定された場合、出力されません。
- jvm_alloc_size
-
Java VM内部で管理している領域のうち、現在使用中の領域のサイズ(mmap_total_sizeとmalloc_total_sizeの合計サイズのうち、現在使用中の領域のサイズ)。
-XX:-HitachiVerboseGCPrintJVMInternalMemoryオプションが指定された場合、出力されません。
- mmap_total_size
-
Java VM内部で管理している領域のうち、mmap(Windowsの場合はVirtualAlloc)で割り当てたCヒープの総サイズ。
-XX:-HitachiVerboseGCPrintJVMInternalMemoryオプションが指定された場合、出力されません。
- malloc_total_size
-
Java VM内部で管理している領域のうち、mallocで割り当てたCヒープの総サイズ。
-XX:-HitachiVerboseGCPrintJVMInternalMemoryオプションが指定された場合、出力されません。
- thread_count
-
Javaスレッドの数。
-XX:-HitachiVerboseGCPrintThreadCountオプションが指定された場合、出力されません。
- doe_alloc_size
-
java.io.File.deleteOnExit()を呼び出して確保した累積のヒープサイズ。
-XX:-HitachiVerboseGCPrintDeleteOnExitオプションが指定された場合、出力されません。
- called_count
-
java.io.File.deleteOnExit()の呼び出し回数。
-XX:-HitachiVerboseGCPrintDeleteOnExitオプションが指定された場合、出力されません。
- cc_used_size
-
GC発生時のコードキャッシュ領域の使用サイズ。単位はキロバイトです。
-XX:-PrintCodeCacheInfoオプションが指定された場合、出力されません。
- cc_max_size
-
コードキャッシュ領域の最大サイズ。単位はキロバイトです。
-XX:-PrintCodeCacheInfoオプションが指定された場合、出力されません。
- cc_info
-
保守情報。
-XX:-PrintCodeCacheInfoオプションが指定された場合、出力されません。
出力形式(G1GCの場合)
オプション"v"または"s"を指定した場合はJava VMログを出力します。
G1GCでは、Java VMログファイルにGCに関するログ(以降、VG1ログ)とConcurrent Marking(以降、CM)に関するログ(以降、VCMログ)を出力します。CMはアプリケーションと並行で処理するため、1回のCMのログは複数行に分かれて出力されます。
VG1 ログ、VCMログの出力フォーマットの詳細を次に示します。
VG1 ログ
[id]<date>[gc_kind gc_info, gc_time secs][Status:gc_status][G1GC::Eden: eden_info][G1GC::Survivor: survivor_info][G1GC::Tenured: tenured_info][G1GC::Humongous: humongous_info][G1GC::Free: free_info][Metaspace: Metaspace_info][class space: class_space_info] [cause:cause_info][RegionSize: region_sizeK][Target: target_time secs][Predicted: predicted_time secs][TargetTenured: target_sizeK][Reclaimable: reclaimable_info][User: user_cpu secs][Sys: system_cpu secs][IM: jvm_alloc_sizeK, mmap_total_sizeK, malloc_total_sizeK][TC: thread_count][DOE: doe_alloc_sizeK, called_count][CCI: cc_used_sizeK, cc_max_sizeK, cc_infoK]
注 改行や、項目間のスペースはありません。
出力項目 |
出力内容 |
意味 |
---|---|---|
id |
VG1 |
Java VMログファイル識別子。G1GC のGCログでは「[VG1]」が出力されます。 |
date |
<letters> |
GCまたはCMが開始された日時。-XX:-HitachiVerboseGCPrintDate指定時は出力されません。 |
gc_kind |
Full GC| Mixed GC|Young GC |Young GC(initial-mark)|CM Remark|CM Cleanup |
GCまたはCMの種別。 |
gc_info |
<const1>K/<const2>K(<const3>K)-><const4>K/<const5>K(<const6>K) |
Javaヒープ領域のメモリー情報。 <const1>:GC前のJavaヒープ領域の使用サイズ。 <const2>:GC前のJavaヒープ領域の使用サイズ(リージョン換算)※1。 <const3>:GC前のJavaヒープ領域の領域サイズ(リージョン換算)。 <const4>:GC後のJavaヒープ領域の使用サイズ。 <const5>:GC後のJavaヒープ領域の使用サイズ(リージョン換算)。 <const6>:GC後のJavaヒープ領域の領域サイズ(リージョン換算)。 単位はキロバイト。 |
gc_time |
<time> |
GCによるアプリケーション停止時間。 単位は秒。 |
gc_status |
-|to exhausted |
GCの状態。
各GCで出力される状態を以下に示します。 gc_kindがYoung GCまたはYoung GC(initial-mark)またはMixed GCの場合:「-」または「to exhausted」が出力されます。 gc_kindが上記以外の場合: 「-」が出力されます。 |
eden_info |
<const1>K(<const2>K)-><const3>K(<const4>K) |
Eden領域のメモリー情報。 <const1>:GC前のEden領域の使用サイズ(リージョン換算)。 <const2>:GC前のEden領域が取り得る最大の領域サイズ(リージョン換算)※2。 <const3>:GC後のEden領域の使用サイズ(リージョン換算)。 <const4>:GC後のEden領域が取り得る最大の領域サイズ(リージョン換算)※2。 単位はキロバイト。 |
survivor_info |
<const1>K-><const2>K |
Survivor領域のメモリー情報。 <const1>:GC前のSurvivor領域の使用サイズ(リージョン換算)。 <const2>:GC後のSurvivor領域の使用サイズ(リージョン換算)。 単位はキロバイト。 |
tenured_info |
<const1>K-><const2>K |
Tenured領域のメモリー情報。 <const1>: GC前のTenured領域の使用サイズ(リージョン換算)。 <const2>: GC後のTenured領域の使用サイズ(リージョン換算)。 単位はキロバイト。 |
humongous_info |
<const1>K-><const2>K |
Humongous領域のメモリー情報。 <const1>: GC前のHumongous領域の使用サイズ(リージョン換算)。 <const2>: GC後のHumongous領域の使用サイズ(リージョン換算)。 単位はキロバイト。 |
free_info |
<const1>K-><const2>K |
Free領域のメモリー情報。 <const1>: GC前のFree領域の使用サイズ(リージョン換算)。 <const2>: GC後のFree領域の使用サイズ(リージョン換算)。 単位はキロバイト。 |
Metaspace_info |
<const1>K(<const2>K, <const3>K)-><const4>K(<const5>K, <const6>K)] |
Metaspace領域のメモリー情報。
単位はキロバイト。 |
class_space_info |
<const1>K(<const2>K, <const3>K)-><const4>K(<const5>K, <const6>K)] |
class space領域のメモリー情報。 圧縮オブジェクトポインタ機能が無効の場合、出力されません。
単位はキロバイト。 |
cause_info |
<letters> |
GC要因内容。 -XX:-HitachiVerboseGCPrintCause指定時は出力されません。 |
region_size |
<const> |
1リージョンのサイズ。 単位はキロバイト。 |
target_time |
<time> |
GCによるアプリケーション停止時間の目標時間。 単位は秒。 |
predicted_time |
<time> |
Java VMが予測したGCによるアプリケーション停止時間。 単位は秒。 GC 種別が「Full GC」、「CM Remark」または「CM Cleanup」の場合、予測を行わないため、0が出力されます。 |
target_size |
<const> |
Mixed GCでGC対象となったTenured領域のサイズ。 単位はキロバイト。 GC種別が「Mixed GC」以外の場合は0が出力されます。 |
reclaimable_info |
<const1>K(<const2>.<digit><digit>%) |
予測回収サイズ情報。 <const1>:予測回収サイズ。 単位はキロバイト。 <const2>.<digit><digit>:予測回収率(小数第2位まで) なお、予測回収サイズ情報は、CM終了直後のYoung GCまたはMixed GCだけが出力されます。それ以外の場合、予測を行わないため、0が出力されます。 |
user_cpu |
<time> |
全GCスレッドがユーザーモードで費やしたCPU時間の合計。 単位は秒。 -XX:-HitachiVerboseGCCpuTime指定時は出力されません。 CPU 時間取得に失敗した場合には「unknown」と表示します:[User: unknown] |
system_cpu |
<time> |
全GCスレッドがカーネルモードで費やしたCPU時間の合計。 単位は秒。 -XX:-HitachiVerboseGCCpuTime指定時は出力されません。 CPU 時間取得に失敗した場合には「unknown」と表示します:[Sys: unknown] |
注※1 リージョン換算は、領域のサイズを1リージョンのサイズで切り上げ、1リージョンのサイズの倍数で表した値です。
注※2 Eden領域が取り得る最大の領域サイズは、(New領域の領域サイズ)-(Survivor領域の使用サイズ)を指します。
VCM ログ
[id]<date> [cm_event][User: user_cpu secs][Sys: sys_cpu secs]
*改行なし。*項目間のスペースなし。
出力項目 |
出力内容 |
意味 |
---|---|---|
id |
VCM |
Java VMログファイル識別子。G1GCのCMログでは「[VCM]」が出力されます。 |
date |
<letters> |
CMが開始された日時。 -XX:-HitachiVerboseGCPrintDate指定時は出力されません。 |
cm_event |
Concurrent Root Region Scan Start|Concurrent Root Region Scan End|Concurrent Mark Start|Concurrent Mark End|Concurrent Mark Stop|Concurrent Cleanup Start|Concurrent Cleanup End |
CMの状態。 Concurrent Root Region Scan Start: Concurrent Root Region Scanが開始された。 Concurrent Root Region Scan End: Concurrent Root Region Scanが終了した。 Concurrent Mark Start:Concurrent Markが開始された。 Concurrent Mark End:Concurrent Markが終了した。 Concurrent Mark Stop:Concurrent Markを中止した。 Concurrent Cleanup Start:Concurrent Cleanupが開始された。 Concurrent Cleanup End :Concurrent Cleanupが終了した。 |
usr_cpu |
<time> |
全CMスレッドがユーザーモードで費やしたCPU時間の合計。 単位は秒。 -XX:-HitachiVerboseGCCpuTime指定時は出力されません。 CPU時間取得に失敗した場合には「unknown」と表示します:[User: unknown] CM の状態がStartの場合、0が出力されます。 |
sys_cpu |
<time> |
全CMスレッドがカーネルモードで費やしたCPU時間の合計。 単位は秒。 -XX:-HitachiVerboseGCCpuTime指定時は出力されます。 CPU時間取得に失敗した場合には「unknown」と表示します:[Sys: unknown] CM の状態がStartの場合、0が出力されます。 |
入力例
-
-iオプションを指定してjavagcコマンドを実行します。
javagc -i -v -p 8326
-
GCを発生させるかどうかの確認メッセージが表示されます。
Force VM to execute GC ? (y/n)
-
GCを発生させる場合はyを、発生させない場合はnを入力します。
Force VM to execute GC ? (y/n)y
出力例
VG1 ログ
[VG1]<Thu Oct 02 10:38:56.193 2014>[Full GC 753K/2048K(8192K)->678K/1024K(8192K), 0.0097901 secs][Status:-][G1GC::Eden: 1024K(2048K)->0K(2048K)][G1GC::Survivor: 0K->0K][G1GC::Tenured: 1024K->1024K][G1GC::Humongous: 0K->0K][G1GC::Free: 6144K->7168K] [Metaspace: 3634K(4492K, 4492K)->3634K(4492K, 4492K)][class space: 356K(388K, 388K)->356K(388K, 388K)] [cause:System.gc][RegionSize: 1024K][Target: 0.2000000 secs][Predicted: 0.0000000 secs][TargetTenured: 0K][Reclaimable: 0K(0.00%)][User: 0.0000000 secs][Sys: 0.0000000 secs][IM: 20459K, 21920K, 0K][TC: 35][DOE: 0K, 0][CCI: 1172K, 245760K, 2496K]
VCM ログ
[VCM]<Wed Jul 24 11:45:20 2013>[Concurrent Root Region Scan Start][User: 0.0000000 secs][Sys: 0.0000000 secs] [VCM]<Wed Jul 24 11:45:20 2013>[Concurrent Root Region Scan End][User: 0.0126134 secs][Sys: 0.0146961 secs] [VCM]<Wed Jul 24 11:45:20 2013>[Concurrent Mark Start][User: 0.0000000 secs][Sys: 0.0000000 secs] [VCM]<Wed Jul 24 11:45:34 2013>[Concurrent Mark End][User: 0.0156250 secs][Sys: 0.2495800 secs]
戻り値
戻り値 |
説明 |
---|---|
0 |
正常終了しました。 |
1 |
異常終了しました。 |
2 |
一定時間内にGC処理終了の応答がありませんでした。 |
出力メッセージ
次のエラーメッセージまたは警告メッセージが出力された場合、Explicitヒープ詳細情報付き拡張スレッドダンプは出力されません。
項番 |
エラーメッセージ |
説明 |
---|---|---|
1 |
usage: javagc [-f|-i] [-v] [-s] [-ehgc] -p process-id |
javagcコマンドへの引数の指定が間違っています。 |
2 |
javagc: illegal option--オプション |
javagcコマンドに指定したオプションが不正です。 |
3 |
javagc: can't communicate with process プロセスID |
javagcコマンドの引数に指定したプロセスIDに問題があり、通信処理でエラーが発生しているため通信できません。または、javagcコマンドの引数に指定したプロセスIDに該当するプロセスがありません。 |
4 |
プロセスID: Not owner |
javagcコマンドで指定したプロセスIDに0が指定されています。 |
5 |
プロセスID: Now processing previous request, this request canceled |
javagcコマンドの引数に指定したプロセスIDに該当するプロセスは、前回のjavagcコマンドによるGCを実行中です。javagcコマンドによるGC実行要求はキャンセルされます。 |
6 |
javagc: can’t create work file at temporary directory, this request canceled |
一時ファイル用ディレクトリーに参照・書き込み権限がない場合、GC要求ファイルが作成できません。このGC実行要求はキャンセルされます。 |
7 |
javagc: can't get temporary directory, this request canceled |
一時ファイル用ディレクトリーが取り出せない場合、GC要求ファイルが作成できません。このGC実行要求はキャンセルされます。 |
8 |
javagc: unexpected error occurred:エラー原因 |
javagcコマンド実行中に予期しないエラーが発生しました。エラー原因には、例えば下記のような表示がされます。
|
9 |
プロセスID: Timeout occurred. Java process not responding. |
javagcコマンドの引数に指定したプロセスIDに該当するプロセスから、一定時間内にGC処理終了の応答がありませんでした。 |
10 |
javagc : please delete 削除できなかったファイル名 in 削除できなかったファイルの絶対パス |
javagcコマンドを終了したときに、内部ファイルを削除できませんでした。削除できなかったファイルの絶対パスにある、削除できなかったファイルを削除してください。 |
11 |
プロセスID: Failed to retry GC. Java process is GC locked. |
javagcコマンドの引数に指定したプロセスIDのプロセスが、GC実行が抑止される状態のため、GC処理を実行できませんでした。 |
注意事項
-
同じjavaプロセスに対して、同時にjavagcコマンドは実行できません。前回のjavagcコマンドによるGC処理が終了してから実行してください。前回のGC処理が終了している場合は、Java VMログファイルに出力される拡張verbosegc機能のGCの要因に"JavaGC Command"が出力されます。
-
このコマンドは、Windows APIのGetTempPath()関数で得られるディレクトリーに一時ファイルを作成します。このコマンドを正常に動作させるためには、このディレクトリーに書き込み権限が必要です。また、Java VMプロセス起動中はこのディレクトリーを削除しないでください。なお、このディレクトリーにWindowsのシステムディレクトリーを指定しないでください。