New世代領域用GC制御に対し、「当該処理を並列化して実行する機能」を追加して構成されたGC処理です。New世代領域用のGC制御を並列化して実行することから、このGCをパラレルGCと呼ぶ場合もあります。
図1のオプションは、パラレルGCによるGC制御を有効にするオプションです。
JDK/JRE 6、7のFJVMの場合は、デフォルトでこのGC処理が実行されます。
図1 JDK/JRE 6、7でパラレルGCを有効にする場合に指定するオプション
-XX:+UseParallelGC |
図2はパラレルGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。
なお、パラレルGC使用時は、JavaヒープのNew世代領域およびOld世代領域の大きさに関する値が自動的に調整および最適化されるため、通常、New世代領域の大きさやNew世代領域とOld世代領域の大きさのバランスをチューニングするためのオプションを使用する必要はありません。
図2 Javaヒープチューニング用オプション(パラレルGC使用時)
-Xms |
(*) New世代領域の大きさや、New世代領域とOld世代領域の大きさのバランスをチューニングするためのオプションです。
GC処理用スレッド数
パラレルGCを使用した場合は、実行するハードウェアに搭載しているCPU数に依存した数のGC処理用スレッドがJavaプロセス内に作成されます。そのため、GC処理用スレッドの数分だけ、スタック域などのスレッド用のメモリ領域が必要となります。
Javaプロセス内でのメモリ量を抑えるためなど、GC処理用スレッドの数を調整する場合には、図3のオプションでGC処理用スレッドの数を指定することにより、GC処理用スレッドの数を調整することができます。
なおGC処理用スレッドの数を抑制した分だけGC処理における性能がおちる場合もありますので、このオプションを用いる場合には、十分な性能確認を実施してください。また、一般的に、CPU数以上の数のGC処理用スレッドを作成しても、GC処理における性能向上にはつながりません。
図3 パラレルGCで使用するGC処理用スレッドの数を指定するオプション
-XX:ParallelGCThreads=New世代領域GC用スレッドの数 |
メモリ割り当てプールの省略値自動調整機能
FJVMのパラレルGCでは、JDK/JRE 6、7の機能であるエルゴノミクス機能によるメモリ割り当てプールの初期値(-Xms)および最大値(-Xmx)の省略値自動調整機能(マシンの物理メモリ量などに応じて、-Xmsおよび-Xmxの各オプションに対する省略値を自動的に決定する機能)を無効にしています。
JDK/JRE 6、7のFJVMで、エルゴノミクス機能によるメモリ割り当てプールの省略値自動調整機能を有効にする場合は、図4のオプションを指定してください。
ただし、このオプション指定は、システムのメモリ資源不足の要因となる場合があるため、システム内に複数のJavaプロセスを起動、実行する場合には使用しないでください。
図4 JDK/JRE 6、7でメモリ割り当てプールの省略値自動調整機能を有効にするオプション
-XX:+AutomaticallyJavaHeapSizeSetting |
メモリ領域不足事象の検出機能
FJVMのパラレルGCでは、JDK/JRE 6、7の機能であるエルゴノミクス機能によるメモリ領域不足事象の検出機能(図5の各オプション指定値による条件が同時に成立した場合に、メモリ領域不足事象(java.lang.OutOfMemoryError)として検出する機能)を無効にしています。
JDK/JRE 6、7のFJVMでエルゴノミクス機能によるメモリ領域不足事象検出機能を有効にする場合は、図6のオプションを指定してください。
ただし、このオプション指定で検出されるメモリ領域不足事象は、Javaヒープの使用量だけではなく、メモリ領域不足事象検出用オプションで指定された値、およびガーベジコレクション処理の動作状況から得られた統計情報などを元に決定されるため、Javaヒープの使用量が不足していない状態であっても、 メモリ領域不足事象が検出される場合がありますので注意してください。
図5 メモリ領域不足事象検出条件
-XX:GCTimeLimit=GC処理に要する時間の上限値 (デフォルトは98) -XX:GCHeapFreeLimit=GC処理後のJavaヒープ量の空きスペースの下限値 (デフォルトは2) |
図6 JDK/JRE 6、7でメモリ領域不足事象検出を有効にするオプション
-XX:+UseGCOverheadLimit |
パラレルGC処理のエルゴノミクス機能およびメモリ割り当てプールの最小使用量保証機能
FJVMでパラレルGCを使用した場合、JDK/JRE 6、7の機能であるパラレルGC処理のエルゴノミクス機能(メモリ割り当てプール内の各世代領域サイズの動的変更機能)により、Javaアプリケーションの実行状況や負荷/GC処理に掛かる時間などの情報から、GC処理としての最適動作状態になるように、メモリ割り当てプール内の各世代領域サイズが自動的に調整・変更および最適化されます。
その際、メモリ割り当てプールの使用量が-Xmsオプションで指定した値(メモリ割り当てプールの初期値)よりも小さくなることあります(-Xmsオプションで指定した値よりも下回るメモリ割り当てプールの使用量で、GC処理としての最適動作状態になることがあります)。
パラレルGCを使用してJavaアプリケーションを実行する際、メモリ割り当てプールの使用量についての操作を行なう場合は、以下のオプションを指定してください。
メモリ割り当てプールの最小使用量保証機能を操作するオプション
【-Xmsオプションで指定した値よりもメモリ割り当てプールの使用量を小さくしない場合】
-XX:+UseAdaptiveSizePolicyMinHeapSizeLimit
パラレルGC処理のエルゴノミクス機能動作時、-Xmsオプション指定値によるメモリ割り当てプールの最小使用量保証機能を有効にします。
Javaアプリケーション実行時に使用されるメモリ割り当てプールの大きさは,「-Xmsオプション指定値」から「-Xmxオプション指定値」の範囲で変動します。
(-Xmsオプション指定値と-Xmxオプション指定値が等しい場合、使用中となるメモリ割り当てプールの大きさは変動しません。)
この状態は、JDK/JRE 6、7でパラレルGCを使用する場合のデフォルト状態です。
【-Xmsオプションで指定した値よりもメモリ割り当てプールの使用量を小さくして良い場合】
-XX:-UseAdaptiveSizePolicyMinHeapSizeLimit
パラレルGC処理のエルゴノミクス機能動作時、-Xmsオプション指定値によるメモリ割り当てプールの最小使用量保証機能を無効にします。
Javaアプリケーション実行時に使用されるメモリ割り当てプールの大きさは,「Java VMとしての下限値」から「-Xmxオプション指定値」の範囲で変動します。
(-Xmsオプション指定値と-Xmxオプション指定値が等しい場合であっても、使用中となるメモリ割り当てプールの大きさは変動します。)
なお、Javaアプリケーションの実行時に使用されるメモリ割り当てプールの大きさが-Xmsオプション指定値よりも小さくなった場合、Full GCの発生間隔が、Javaプロセス起動時近辺における発生間隔よりも短くなってしまう場合があります。しかし、パラレルGC処理のエルゴノミクス機能は、GC処理に掛かる時間情報も考慮した上で、GC処理としての最適動作状態となるように調整しています(メモリ割り当てプールを縮小しても、Full GCに掛かる時間が少ない状態の場合に最適動作状態としています)。そのため、メモリ割り当てプールの縮小によりFull GCの発生間隔が短くなった場合でも、Javaアプリケーション実行時の性能に対する影響はほとんどありません。
なお、このオプションは、パラレルGCを動作させたJDK/JRE 5.0で実行していたアプリケーションを、パラレルGCを動作させるJDK/JRE 6、7を用いて実行させる際、使用中となるメモリ割り当てプールの大きさに対する挙動の互換性を向上させる必要がある場合に使用します。
通常、このオプションを指定する必要はありません。
なおメモリ割り当てプールの最小使用量保証機能の有効/無効に関わらず、Javaプロセス起動時に使用されるメモリ割り当てプールの大きさは、-Xmsオプションで指定された値となります。