New世代領域用GC制御を並列化して実行する機能、およびJavaアプリケーションと同時並列に動作するOld世代領域用GC制御「コンカレント・マーク・スイープGC(CMS-GC)機能」を追加して構成されたGC処理です。CMS-GC機能を追加されたパラレルGC制御であることから、このGCをCMS付きパラレルGCと呼ぶ場合もあります。
CMS-GCは、JavaアプリケーションがFull GCによって停止されることにより影響を受ける「アプリケーションの応答性能の平準化」を改善するために実行される「Old世代領域内の不要オブジェクト回収用のGC機構」です。
Javaアプリケーションを停止させて実行するFull GCに対し、CMS-GCはJavaアプリケーションと同時並列に動作し、Old世代領域内の不要オブジェクトを回収します。CMS-GCの実行により、Old世代領域(New世代領域にあるオブジェクトの移動先や巨大オブジェクトの生成先となる領域)の空きを、Javaアプリケーション動作と並行して増加させることができるため、Full GCの発生を抑えることができます。これにより、JavaアプリケーションはFull GCにより停止される影響を受けにくくなり、応答性能平準化の改善が期待できます。
なおCMS-GC動作中は、NewGC処理/Full GC処理の実行開始が遅延する場合があります。そして遅延期間中は、Javaアプリケーションとしての動作も停止します。そのため、ガーベジコレクション処理の結果ログ内のNewGC処理/Full GC処理に対して出力されたGC処理実行時間よりも長い間、Javaアプリケーションとしての動作が停止している場合があります。
CMS付きパラレルGCを有効に場合に指定するオプション
-XX:+UseConcMarkSweepGC |
注意
“-XX:UseFJcmsGC=タイプ”オプションは、JDK/JRE 7では指定可能ですが、JDK/JRE 8では指定できません。
“-XX:UseFJcmsGC=タイプ”に相当するオプションは以下を参照してください。
利用者が細かくチューニング作業を行うことが可能なCMS付きパラレルGCを使用する場合
(JDK/JRE7の-XX:UseFJcmsGC=type0またはtype0p指定に相当)
-XX:NewRatio=7 |
以下は、上記オプション指定時に利用可能となる「Javaヒープおよびメタスペースのチューニング用オプション」です。チューニング用オプションを用いて、利用者が細かくチューニング作業を行うことが可能なCMS付きパラレルGCを使用する場合に指定します。
Javaヒープおよびメタスペースのチューニング用オプション(利用者が細かくチューニング作業をするオプション指定の場合)
-Xms |
New世代領域用GCでのオブジェクト回収を重視したCMS付きパラレルGCを使用する場合
(-XX:UseFJcmsGC=type1またはtype1p指定に相当)
-XX:NewRatio=2 |
New世代領域用GCでのオブジェクト回収を重視したCMS付きパラレルGCを使用する場合に指定します。
実行されるアプリケーションの特徴が「大半のオブジェクトが、少ない回数のNew世代領域用GCによって回収されるオブジェクト」である場合に、CMS-GCによる応答性能平準化の改善効果が得やすい調整になっています。
Javaヒープおよびメタスペースのチューニングを行う場合は、まず-Xms/-Xmxおよび-XX: MetaspaceSize/-XX: MaxMetaSpaceSizeの各オプションにより、メモリ割り当てプールおよびメタスペースの大きさを調整します。そして必要に応じて、-XX:NewSize/-XX:MaxNewSizeの各オプションでNew世代領域の大きさを調整します。
なおNew世代領域サイズとして、メモリ割り当てプール最大サイズ未満の値を指定できます。ただしNew世代領域サイズを大きくしすぎると、Full GCが発生しやすくなってしまうので注意が必要です。
以下は、New世代領域用GCでのオブジェクト回収を重視したオプション指定時に利用可能となる「Javaヒープおよびメタスペースのチューニング用オプション」です。
Javaヒープおよびメタスペースのチューニング用オプション(New世代領域用GCでのオブジェクト回収を重視したオプション指定時)
-Xms |
CMS-GCでのオブジェクト回収を重視したCMS付きパラレルGCを使用する場合
(-XX:UseFJcmsGC=type2またはtype2pが指定に相当)
-XX:NewRatio=15 |
CMS-GCでのオブジェクト回収を重視したCMS付きパラレルGCを使用する場合に指定します。
実行されるアプリケーションの特徴が「大半のオブジェクトが、何回かのGCを経てから回収される(長期間常駐せず、ある程度の短期間で回収される)オブジェクト」である場合に、CMS-GCによる応答性能平準化の改善効果が得やすい調整になっています。
Javaヒープおよびメタスペースのチューニングを行う場合は、まず-Xms/-Xmxおよび-XX: MetaspaceSize/-XX: MaxMetaspaceSizeの各オプションにより、メモリ割り当てプールおよびメタスペースの大きさを調整します。そして必要に応じて、-XX:NewSize/-XX:MaxNewSizeの各オプションでNew世代領域の大きさを調整します。
なおNew世代領域サイズとして、メモリ割り当てプール最大サイズ未満の値を指定できます。ただしNew世代領域サイズを大きくしすぎると、Full GCが発生しやすくなってしまうので注意が必要です。
以下は、-XX:UseFJcmsGC=type2およびtype2p指定時に利用可能となる「Javaヒープおよびメタスペースのチューニング用オプション」です。
Javaヒープおよびメタスペースのチューニング用オプション(CMS-GCでのオブジェクト回収を重視したオプション指定時)
-Xms |
GC処理用スレッド数
CMS付きパラレルGCを使用した場合は、実行するハードウェアに搭載しているCPU数に依存した数のGC処理用スレッドがJavaプロセス内に作成されます。そのため、GC処理用スレッドの数分だけ、スタック域などのスレッド用のメモリ領域が必要となります。
Javaプロセス内でのメモリ量を抑えるためなど、GC処理用スレッドの数を調整する場合には、以下のオプションでGC処理用スレッドの数を指定することにより、GC処理用スレッドの数を調整することができます。
なおGC処理用スレッドの数を抑制した分だけGC処理における性能がおちる場合もありますので、このオプションを用いる場合には、十分な性能確認を実施してください。また、一般的に、CPU数以上の数のGC処理用スレッドを作成しても、GC処理における性能向上にはつながりません。
CMS付きパラレルGCで使用するGC処理用スレッドの数を指定するオプション
-XX:ParallelGCThreads=New世代領域GC用スレッドの数 |
最小値は「2」です。「0」または「1」が指定された場合は、デフォルト値となります。
デフォルト値は以下のとおりです。
実行するハードウェアに搭載しているCPU数が1の場合 = 2
実行するハードウェアに搭載しているCPU数が2以上7以下の場合 = CPU数分
実行するハードウェアに搭載しているCPU数が8以上の場合 = 8
CMS-GC処理用スレッド数
CMS付きパラレルGCを使用した場合は、以下のCMS-GC処理用スレッドがJavaプロセス内に作成されます。そのため、CMS-GC処理用スレッドの数分だけ、スタック域などのスレッド用のメモリ領域が必要となります。
CMSスレッド (必ず1つ作成されます)
コンカレント・マーク処理専用スレッド
CMSスレッドの他、CMS-GC処理の中のコンカレント・マーク処理を複数スレッドで並列化して実行するために、コンカレント・マーク処理専用スレッドを追加で作成することができます。以下のオプションでCMS-GC処理用スレッドの数を指定することにより、CMS-GC処理用スレッドの数を調整することができます。
なお一般的に、CPU数以上の数のCMS-GC処理用スレッドを作成しても、CMS-GC処理における性能向上にはつながりません。
CMS付きパラレルGCで使用するCMS-GC処理用スレッドの数を指定するオプション
-XX:ConcGCThreads=CMS-GC処理用スレッドの数 |
最小値は「2」です。オプションの指定がない場合、または「1」が指定された場合は、CMSスレッドだけ生成されます。
「0」が指定された場合は、自動的に以下の値が設定されます。(実行するハードウェアに搭載しているCPU数の1/4(端数切り上げ)をAとした場合)
Aが1の場合 = 0(CMSスレッドだけ生成されます)
Aが2以上7以下の場合 = A
Aが8以上の場合 = 8
なお指定値および自動設定値どちらの場合も、「-XX:ParallelGCThreads」の値よりも大きい場合は、「-XX:ParallelGCThreads」の値となります。