FJVMでサポートされるガーベジコレクション(GC)処理には、JavaヒープのNew世代領域に対するGC制御方法の違いにより、以下の3種類があります。
■標準GC(シリアルGC)
New世代領域用GC制御に対して何も付加機能を追加していない「標準機能のみ」で構成されたGC処理です。後述のパラレルGCとの対比から、標準GCのことをシリアルGCと呼ぶ場合もあります。
Java HotSpot Client VM、実行モードが64ビットモードのJDK/JRE 1.4(ただし、Windows Server(R) 2003 for Itanium-based SystemsおよびRHEL-AS4(IPF)にのみ対応)のFJVM、および図1のオプションを指定した場合のFJVMでは、シリアルGCが実行されます。なお、図1のオプションは、後述のFJGCまたはパラレルGCによるGC制御を無効にするオプションです。
図1 FJVMでシリアルGCを有効にする場合に指定するオプション
JDK/JRE 1.4の場合: -XX:-UseFJGC |
図2はシリアルGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。
図2 Javaヒープチューニング用オプション(シリアルGC使用時)
-Xms |
■New世代領域サイズ自動調整機能付きGC(FJGC)
New世代領域用GC制御に対し、富士通独自技術による「New世代領域サイズ自動調整機能」を追加して構成されたGC処理です。富士通独自技術によるGC制御を用いていることから、このGCをFJGCと呼ぶ場合もあります。
実行モードが32ビットモードのJDK/JRE 1.4のFJVMの場合は、デフォルトでこのGC処理が実行されます。
JDK/JRE 5.0のFJVMの場合は、図3のオプションを指定した場合に、このGC処理が実行されます。
なお、JDK/JRE 6のFJVMでは、本機能を提供していません。
図3 JDK/JRE 5.0のFJVMでNew世代領域サイズ自動調整機能を有効にするオプション
-XX:+UseFJGC |
図4はFJGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。
図4 Javaヒープチューニング用オプション(FJGC使用時)
-Xms |
New世代領域サイズ自動調整機能未提供のFJVM
次のFJVMには、New世代領域サイズ自動調整機能を提供していません。
実行モードが64ビットモードのFJVM
JDK/JRE6のFJVM
このFJVMに図3のオプションを指定した場合は、図5のワーニングメッセージが標準エラー出力へ出力され、オプションの指定は無効になります。
図5 -XX:+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世代領域用制御処理並列化機能付きGC(パラレルGC)
New世代領域用GC制御に対し、「当該処理を並列化して実行する機能」を追加して構成されたGC処理です。New世代領域用のGC制御を並列化して実行することから、このGCをパラレルGCと呼ぶ場合もあります。
JDK/JRE 5.0、6のFJVMの場合は、デフォルトでこのGC処理が実行されます。
図6はパラレルGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。
図6 Javaヒープチューニング用オプション(パラレルGC使用時)
-Xms |
JDK/JRE 1.4の場合
JDK/JRE 1.4のFJVMでは、パラレルGCはサポート対象外のGC処理です。
JVMPIとJVMTI
次の場合、Java Virtual Machine Profiling Interface(JVMPI)をサポートしていません。
JDK/JRE 5.0を使用し、GC処理としてパラレルGCが選択されている場合
JDK/JRE 6を使用している場合
JVMPI相当の機能を使用する場合には、JDK/JRE 5.0から導入されたJava Virtual Machine Tool Interface(JVMTI)を使用してください。
JDK/JRE 5.0でJVMPI機能は推奨されていません。やむを得ず使用する場合は、GC処理としてシリアルGCを使用してください。
GC処理用スレッド数
パラレルGCを使用した場合は、実行するハードウェアに搭載しているCPU数分のGC処理用スレッドがJavaプロセス内に作成されます。そのため、GC処理用スレッドの数分だけ、スタック域などのスレッド用のメモリ領域が必要となります。
Javaプロセス内でのメモリ量を抑えるためなど、GC処理用スレッドの数を抑制する場合には、図7のオプションでGC処理用スレッドの数を指定することにより、GC処理用スレッドの数を抑制することができます。
なおGC処理用スレッドの数を抑制した分だけGC処理における性能がおちる場合もありますので、このオプションを用いる場合には、十分な性能確認を実施してください。また、一般的に、CPU数以上の数のGC処理用スレッドを作成しても、GC処理における性能向上にはつながりません。
図7 パラレルGCで使用するGC処理用スレッドの数を指定するオプション
-XX:ParallelGCThreads=GC処理用スレッドの数(0を指定した場合は搭載CPU数) |
メモリ割り当てプールの省略値自動調整機能
FJVMのパラレルGCでは、JDK/JRE 5.0、6の機能であるエルゴノミクス機能によるメモリ割り当てプールの初期値(-Xms)および最大値(-Xmx)の省略値自動調整機能(マシンの物理メモリ量などに応じて、-Xmsおよび-Xmxの各オプションに対する省略値を自動的に決定する機能)を無効にしています。
JDK/JRE 5.0、6のFJVMで、エルゴノミクス機能によるメモリ割り当てプールの省略値自動調整機能を有効にする場合は、図8のオプションを指定してください。
ただし、このオプション指定は、システムのメモリ資源不足の要因となる場合があるため、システム内に複数のJavaプロセスを起動、実行する場合には使用しないでください。
図8 JDK/JRE 5.0、6のFJVMでメモリ割り当てプールの省略値自動調整機能を有効にするオプション
-XX:+AutomaticallyJavaHeapSizeSetting |
メモリ領域不足事象の検出機能
FJVMのパラレルGCでは、JDK/JRE 5.0、6の機能であるエルゴノミクス機能によるメモリ領域不足事象の検出機能(図9の各オプション指定値による条件が同時に成立した場合に、メモリ領域不足事象(java.lang.OutOfMemoryError)として検出する機能)を無効にしています。
JDK/JRE 5.0、6のFJVMでエルゴノミクス機能によるメモリ領域不足事象検出機能を有効にする場合は、図10のオプション(使用するJDK/JREの違いにより異なるため注意が必要です)を指定してください。
ただし、このオプション指定で検出されるメモリ領域不足事象は、Javaヒープの使用量だけではなく、メモリ領域不足事象検出用オプションで指定された値、およびガーベジコレクション処理の動作状況から得られた統計情報などを元に決定されるため、Javaヒープの使用量が不足していない状態であっても、 メモリ領域不足事象が検出される場合がありますので注意してください。
図9 メモリ領域不足事象検出条件
-XX:GCTimeLimit=GC処理に要する時間の上限値 (デフォルトは98) -XX:GCHeapFreeLimit=GC処理後のJavaヒープ量の空きスペースの下限値 (デフォルトは2) |
図10 JDK/JRE 5.0、6のFJVMでメモリ領域不足事象検出を有効にするオプション
【JDK/JRE 5.0の場合】
-XX:+UseGCTimeLimit |
【JDK/JRE 6の場合】
-XX:+UseGCOverheadLimit |
メモリ割り当てプールの最小使用量保証機能
FJVMでパラレルGCを使用した場合、JDK/JRE 5.0、6の機能であるパラレルGC処理のエルゴノミクス機能(メモリ割り当てプール内の各世代領域サイズの動的変更機能)により、Javaアプリケーションの実行状況や負荷/GC処理に掛かる時間などの情報から、GC処理としての最適動作状態になるように、メモリ割り当てプール内の各世代領域サイズが自動的に調整・変更および最適化されます。
その際、メモリ割り当てプールの使用量が-Xmsオプションで指定した値(メモリ割り当てプールの初期値)よりも小さくなることあります(-Xmsオプションで指定した値よりも下回るメモリ割り当てプールの使用量で、GC処理としての最適動作状態になることがあります)。
パラレルGCを使用してJavaアプリケーションを実行する際、メモリ割り当てプールの使用量についての操作を行なう場合は、以下のオプションを指定してください。
メモリ割り当てプールの最小使用量保証機能を操作するオプション
【-Xmsオプションで指定した値よりもメモリ割り当てプールの使用量を小さくしない場合】
-XX:+UseAdaptiveSizePolicyMinHeapSizeLimit
パラレルGC処理のエルゴノミクス機能動作時、-Xmsオプション指定値によるメモリ割り当てプールの最小使用量保証機能を有効にします。
Javaアプリケーション実行時に使用されるメモリ割り当てプールの大きさは,「-Xmsオプション指定値」から「-Xmxオプション指定値」の範囲で変動します。
(-Xmsオプション指定値と-Xmxオプション指定値が等しい場合、使用中となるメモリ割り当てプールの大きさは変動しません。)
この状態は、JDK/JRE 6でパラレルGCを使用する場合のデフォルト状態です。
【-Xmsオプションで指定した値よりもメモリ割り当てプールの使用量を小さくして良い場合】
-XX:-UseAdaptiveSizePolicyMinHeapSizeLimit
パラレルGC処理のエルゴノミクス機能動作時、-Xmsオプション指定値によるメモリ割り当てプールの最小使用量保証機能を無効にします。
Javaアプリケーション実行時に使用されるメモリ割り当てプールの大きさは,「Java VMとしての下限値」から「-Xmxオプション指定値」の範囲で変動します。
(-Xmsオプション指定値と-Xmxオプション指定値が等しい場合であっても、使用中となるメモリ割り当てプールの大きさは変動します。)
この状態は、JDK/JRE 5.0でパラレルGCを使用する場合のデフォルト状態です。
なおメモリ割り当てプールの最小使用量保証機能の有効/無効に関わらず、Javaプロセス起動時に使用されるメモリ割り当てプールの大きさは、-Xmsオプションで指定された値となります。
■デフォルトのGC
GCは、デフォルトのGCの使用を推奨します。
通常、デフォルトのGCを変更する必要はありません。
以下に、各環境におけるデフォルトのGCを示します。
【JDK/JREの実行モードが32ビットモードの場合】
| JDK/JRE 1.4 | JDK/JRE 5.0 または JDK/JRE 6 | ||
VMの種類 | Client VM | FJVM | Client VM | FJVM |
デフォルトのGC | シリアルGC | FJGC | シリアルGC | パラレルGC |
【JDK/JREの実行モードが64ビットモードの場合】
| JDK/JRE 1.4 | JDK/JRE 5.0 または JDK/JRE 6 |
VMの種類 | FJVM | FJVM |
デフォルトのGC | シリアルGC | パラレルGC |
※実行モードが64ビットモードのClient VMを提供していません。
※Windows Server(R) for Itanium-based Systems、Linux for ItaniumのJDK/JRE 6を提供していません。