New世代領域用GC制御に対し、富士通独自技術による「New世代領域サイズ自動調整機能(以降、自動調整機能と略する)」を追加して構成されたGC処理です。富士通独自技術によるGC制御を用いていることから、このGCをFJGCと呼ぶ場合もあります。
本機能は、実行モードが32ビットモードのJDK/JRE 5.0に搭載されたFJVMにだけ提供されており、図1のオプションを指定した場合に、このGC処理が実行されます。
図1 JDK/JRE 5.0のFJVMでNew世代領域サイズ自動調整機能を有効にするオプション
-XX:+UseFJGC |
図2はFJGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。
なお、FJGC使用時かつNew世代領域サイズ自動調整機能が有効な場合は、JavaヒープのNew世代領域およびOld世代領域の大きさに関する値が自動的に調整および最適化されるため、New世代領域の大きさやNew世代領域とOld世代領域の大きさのバランスをチューニングするためのオプションは使用できません。
図2 Javaヒープチューニング用オプション(FJGC使用時)
-Xms |
注) New世代領域の大きさや、New世代領域とOld世代領域の大きさのバランスをチューニングするためのオプションです。
図4で示す範囲よりも大きな値を“-Xmx”オプションで指定し、自動調整機能が停止した場合にだけ、このオプションへの指定値は有効となります。
New世代領域サイズ自動調整機能未提供のJava VM
次のJava VMには、New世代領域サイズ自動調整機能を提供していません。
Java HotSpot Client VM
実行モードが64ビットモードのJDK/JRE 5.0に搭載されたFJVM
JDK/JRE 6のFJVM
Java HotSpot Client VMに図1のオプションを指定した場合は、図3のエラーメッセージが標準エラー出力へ出力され、Javaプロセスの起動に失敗します。
FJVMに図1のオプションを指定した場合は、図3のワーニングメッセージが標準エラー出力へ出力され、オプションの指定は無効になります。
図3 -XX:+UseFJGCを指定した際に出力されるメッセージ
【Java HotSpot Client VMの場合】
Unrecognized VM option '+UseFJGC' |
【実行モードが64ビットモードのFJVMの場合】
warning: -XX:+UseFJGC is not supported in Java HotSpot 64-Bit Server VM. |
【実行モードが32ビットモードでJDK/JRE 6のFJVMの場合】
warning: -XX:+UseFJGC is not supported in Java HotSpot Server VM. |
■New世代領域サイズ自動調整機能
自動調整機能は、Javaアプリケーションの実行状況(オブジェクト生成要求および解放タイミングの状態変動)などの情報から、JavaヒープのNew世代領域の大きさに関する値を自動的に調整および最適化する機能です。
自動調整機能は、“メモリ割り当てプールの最大サイズ”が図4に示す値の範囲内である場合に有効となります。(“メモリ割り当てプールの最大サイズ”は、“-Xmx”オプションで指定できます。)
“メモリ割り当てプールの最大サイズ”が図4で示す範囲よりも大きな値である場合は、FJVM起動時に図5のメッセージが標準出力へ出力され、自動調整機能は停止状態となります。
自動調整機能が停止状態となった場合は、New世代領域の大きさに対する自動調整処理は行なわれず、シリアルGCによるGC制御と同じ処理方法で、New世代領域の大きさが制御されるようになります。ただし、その場合に使用できるJavaヒープチューニング用オプションは、図2で示すオプションだけになります。
図4 自動調整機能が有効となるメモリ割り当てプールの最大サイズ
|
図5 自動調整機能停止時に出力されるメッセージ
Heap too large for dynamic eden: using static eden |
JDK/JRE 5.0のFJVMで自動調整機能を有効にしている場合で、かつ以下のような場合には、自動調整機能を有効にするオプションを削除し、FJGC以外のGCを使用してください。
Javaヒープに対するチューニングを手動で行いたい場合:
Java HotSpot Server VMを使用する場合と同じように、Javaヒープチューニング用オプションを用いてJavaヒープに対するチューニングを行いたい場合には、FJGC以外のGCを使用してください。
ネイティブモジュールで使用するメモリ量をある程度確保する必要がある場合:
自動調整機能が有効な場合、当該機能が使用する作業域(“-Xmx”オプションで指定した値の2/3の大きさ)をユーザ空間から確保(リザーブ処理だけの確保)しています。
そのため、“-Xmx”オプションで図4に示す範囲内でかつその上限値近くの値を指定した場合、自動調整機能が使用する作業域確保のため、ネイティブモジュールから使用できるスタックやヒープなどのメモリ量が非常に少なくなっています。
図4に示す範囲の上限値近くの値のメモリ割り当てプールの大きさを確保し、かつネイティブモジュールで使用するスタックやヒープなどのセグメントに対するメモリ量もある程度確保する必要がある場合には、FJGC以外のGCを使用してください。
Javaプロセスのユーザ空間から連続域の状態で確保できるメモリ量が小さいシステムの場合:
自動調整機能が有効な場合、メモリ割り当てプールと自動調整機能用の作業域を連続域としてユーザ空間から確保しています。
また、ユーザ空間から連続域として確保できる最大メモリ量は、システムごとに異なります。
そのため、“-Xmx”オプションで指定したメモリ割り当てプールの大きさが図4に示す値の範囲内であっても、Javaプロセスのユーザ空間から、メモリ割り当てプールと自動調整機能用の作業域が連続域として確保できない場合には(Javaプロセスのユーザ空間から、連続域の状態で確保できるメモリ量が小さいシステムの場合には)、FJVMは以下のメッセージを出力して、Javaアプリケーションの実行を中止します。
その場合は、より小さな値を“-Xmx”オプションで指定するか、FJGC以外のGCを使用してください。
Error occurred during initialization of VM |
GC処理実行抑止によりjava.lang.OutOfMemoryErrorが発生した場合:
自動調整機能では、Javaヒープ域におけるNew世代領域とOld世代領域の比率をJavaアプリケーションからのオブジェクト生成要求および解放タイミングの状態変動により動的に変更します。
そしてNew世代領域とOld世代領域を管理するメモリ割り当てプールの大きさには上限があるため、ある時点においてNew世代領域のサイズを調整・最適化した結果、New世代領域が大きくなった場合は、Old世代領域のサイズは小さくなります(逆にNew世代領域が小さくなった場合は、Old世代領域のサイズは大きくなります)。
そのため自動調整機能が有効な場合、以下の条件に合致するJavaアプリケーションを実行すると、Old世代領域が小さくなっている時とJavaアプリケーションによりGC処理の実行が抑止されている時が重なるタイミングが多くなることがあり、結果的にGC処理実行抑止によるjava.lang.OutOfMemoryErrorの発生が、自動調整機能を無効とした場合よりも多くなることがあります。
寿命の短いオブジェクトを多用するJavaアプリケーション。かつ、
GC処理の実行が抑止される機能を多用するJavaアプリケーション。
GC処理実行抑止によるjava.lang.OutOfMemoryErrorの発生傾向が強い場合は、FJGC以外のGCを使用してください。
なおGC処理の実行が抑止される機能については“表8.3 ガーベジコレクション処理の実行が抑止される機能”を参照してください。