FJVMでサポートされるガーベジコレクション(GC)処理には、JavaヒープのNew世代領域に対するGC制御方法の違いにより、以下の3種類があります。
なお、JDK/JREのバージョン、実行モード、Java VMの種類により、サポートされるGCの種類が異なります。また、Java VMの種類により、デフォルトで動作するGCが異なります。
“表9.2 サポートされるGCの種類”に、サポートされるGCの種類とデフォルトのGCを示します。
JDK/JREの実行モード | 32ビットモード | 64ビットモード※ | ||
---|---|---|---|---|
Java VMの種類 | Client VM | FJVM | FJVM | |
シリアルGC | ◎ | ○ | ○ | |
パラレルGC | ○ | ◎ | ◎ | |
CMS付きパラレルGC | □ | □ | □ |
サポートされるGC
サポートされるGC、かつデフォルトのGC
Interstage Application Server Enterprise EditionでだけサポートされるGC
※実行モードが64ビットモードのClient VMは提供していません。
GCは、デフォルトのGCの使用を推奨します。
通常、デフォルトのGCを変更する必要はありません。
注意
New世代領域用GC制御に対し「New世代領域サイズ自動調整機能」を追加して構成されたGC処理「FJGC」を提供していません。
Java HotSpot Client VMに対して“-XX:+UseFJGC”オプションを指定した場合は、以下のエラーメッセージが標準エラー出力へ出力され、Javaプロセスの起動に失敗します。
FJVMに対して“-XX:+UseFJGC”オプションを指定した場合は、以下ののワーニングメッセージが標準エラー出力へ出力され、オプションの指定は無効になります。
Java HotSpot Client VMの場合
Unrecognized VM option '+UseFJGC'
実行モードが32ビットモードのFJVMの場合
warning: -XX:+UseFJGC is not supported in Java HotSpot Server VM.
実行モードが64ビットモードのFJVMの場合
warning: -XX:+UseFJGC is not supported in Java HotSpot 64-Bit Server VM.
New世代領域の使われ方
NewGC処理では、New世代領域を「eden space」、「from space」および「to space」の3つの内部領域に細分割し、当該領域上において、一般に世代別GC制御と言われる制御方法を用いて、Javaアプリケーションが生成要求したオブジェクトを管理・制御しています。
このうち、「from space」および「to space」は、Java VMがNewGC処理を行う際の作業域的な役割を持つ領域となっています。そのため、「from space」および「to space」の各領域が占める大きさのうち、Javaアプリケーションからのオブジェクト生成要求のために使用される大きさは、その領域の一部分だけとなります。
そのため、ガーベジコレクションのログ出力などの出力データにおいて、メモリ割り当てプールやNew世代領域に空きがあるように見える場合であっても、実際には空きがない場合があります(空きがあるように見える場合であっても、その差は、NewGC処理用の作業域的な役割で使用済となっている場合があります)。
ガーベジコレクション処理の実行抑止
“ガーベジコレクション処理の実行が抑止される機能”に示す機能を使用するJavaアプリケーションを実行すると、Javaヒープ内に存在する全オブジェクトの移動が禁止されるクリティカルセクションと呼ばれる状態が、当該機能の利用状況に応じて発生します。
クリティカルセクション状態発生時は、オブジェクトの移動が禁止されるため、オブジェクト移動が必須となるGC処理の実行が抑止される状態となります。
Java VMは、JavaアプリケーションによりGC処理の実行が抑止されている際に発生したオブジェクト生成要求に対し、New世代領域に空きが無い場合には、Old世代領域の空き領域を一時的に使用して対応します。
そして、要求されたオブジェクト量を満たす空きがOld世代領域にない場合には、java.lang.OutOfMemoryError例外を発生させます。
そのため“ガーベジコレクション処理の実行が抑止される機能”の機能を多用するJavaアプリケーションの場合は、GC処理実行が抑止される状態も多数発生する可能性が高くなり、当該機能を多用しないJavaアプリケーションに比べ、GC処理実行抑止に因るjava.lang.OutOfMemoryError例外が発生しやすい状態にあります。
特にOld世代領域が小さい状態でJavaアプリケーションを実行した場合は、Old世代領域の空きとなり得る最大値(仮にOld世代領域を全く使用しない場合だと、Old世代領域自身の大きさ)もその大きさに比例して小さいため、その傾向が強まることがあります。
なおFJVMでは、GC処理の実行抑止によりjava.lang.OutOfMemoryError例外が発生したかどうかの情報を出力する機能を提供しています。
詳しくは“9.6.1.1 メモリ領域不足事象発生時のメッセージ出力機能の強化”を参照してください。
ガーベジコレクション処理の実行が抑止される機能
GC処理の実行が抑止される状態となるJNI関数
GetPrimitiveArrayCritical()実行からReleasePrimitiveArrayCritical()実行までの間
GetStringCritical()実行からReleaseStringCritical()実行までの間
GC処理の実行が抑止される状態となるJVMPI関数(注)
DisableGC()実行からEnableGC()実行までの間
GC処理の実行が抑止される状態となるJVMPIイベント(注)
JVMPI_EVENT_THREAD_START
JVMPI_EVENT_CLASS_LOAD
JVMPI_EVENT_CLASS_UNLOAD
JVMPI_EVENT_JNI_GLOBALREF_ALLOC
JVMPI_EVENT_JNI_GLOBALREF_FREE
JVMPI_EVENT_JNI_WEAK_GLOBALREF_ALLOC
JVMPI_EVENT_JNI_WEAK_GLOBALREF_FREE
JVMPI_EVENT_OBJECT_ALLOC
JVMPI_EVENT_MONITOR_CONTENDED_ENTER
JVMPI_EVENT_MONITOR_CONTENDED_ENTERED
JVMPI_EVENT_MONITOR_CONTENDED_EXIT
JVMPI_EVENT_MONITOR_WAIT
JVMPI_EVENT_MONITOR_WAITED
JVMPI_EVENT_HEAP_DUMP
JVMPI_EVENT_METHOD_ENTRY
JVMPI_EVENT_METHOD_ENTRY2
JVMPI_EVENT_METHOD_EXIT
注) Java Virtual Machine Profiling Interface(JVMPI)をサポートしていません。
JVMPIとJVMTI
Java Virtual Machine Profiling Interface(JVMPI)をサポートしていません。
JVMPI相当の機能を使用する場合には、Java Virtual Machine Tool Interface(JVMTI)を使用してください。
RMI処理の分散GC
JavaのRMI処理では、クライアントで不要となった参照に対するサーバ側のオブジェクトを破棄するため、Distributed GC(分散GC)という処理を行います。その処理の一貫として、以下のプロパティで設定された時間間隔(デフォルトの時間間隔は1時間)ごとに、java.lang.System.gc()実行によるFull GCが発生します。なお、分散GCとメモリ不足等による通常のガーベジコレクション(GC)が同時に発生した場合は、メモリ不足等による通常のGCが実行され、分散GCによるFullGCは実行されません(メモリ不足等による通常のGCがNewGC処理だった場合は、FullGCにはなりません)。
-Dsun.rmi.dgc.server.gcInterval=時間間隔(ミリ秒) |
分散GCは独自のタイマー制御の元で実行されるため、メモリ不足等による通常のGCの実行とは関係せずに実行されます。そのため、GC処理の結果ログを見た場合、Javaアプリケーションとしての処理がほとんど動作していない時間帯やメモリ不足とは思われない状態のときに、FullGC処理が実行されているように見える場合があります。
またプロパティで指定された時間間隔が短い場合、Interstage Application Serverの予兆監視機能により警告を受ける(OM3204メッセージが出力される)場合がありますので、注意してください。