ページの先頭行へ戻る
Interstage Application Server チューニングガイド

7.2.1 FJVMでサポートされるガーベジコレクション処理

  FJVMでサポートされるガーベジコレクション(GC)処理には、JavaヒープのNew世代領域に対するGC制御方法の違いにより、以下の4種類があります。

■標準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によるGC制御を有効にするオプションです。

図1 FJVMでシリアルGCを有効にする場合に指定するオプション

JDK/JRE 1.4の場合: -XX:-UseFJGC
JDK/JRE 5.0、6の場合: -XX:+UseSerialGC

  図2はシリアルGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。

図2 Javaヒープチューニング用オプション(シリアルGC使用時

-Xms
-Xmx
-XX:NewSize
-XX:MaxNewSize
-XX:NewRatio
-XX:SurvivorRatio
-XX:TargetSurvivorRatio
-XX:PermSize
-XX:MaxPermSize

New世代領域サイズ自動調整機能付きGC(FJGC)

  New世代領域用GC制御に対し、富士通独自技術による「New世代領域サイズ自動調整機能」を追加して構成されたGC処理です。富士通独自技術によるGC制御を用いていることから、このGCをFJGCと呼ぶ場合もあります。
  実行モードが32ビットモードのJDK/JRE 1.4のFJVMの場合は、デフォルトでこのGC処理が実行されます。
  JDK/JRE 5.0のFJVMの場合は、図3のオプションを指定した場合に、このGC処理が実行されます。

  なお、Java HotSpot Client VMおよびJDK/JRE 6のFJVMでは、本機能を提供していません。

図3 JDK/JRE 5.0のFJVMでNew世代領域サイズ自動調整機能を有効にするオプション

-XX:+UseFJGC

  図4はFJGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。

図4 Javaヒープチューニング用オプション(FJGC使用時

-Xms
-Xmx
-XX:PermSize
-XX:MaxPermSize

New世代領域サイズ自動調整機能未提供のFJVM

  次のFJVMには、New世代領域サイズ自動調整機能を提供していません。

  この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と呼ぶ場合もあります。
  図6のオプションは、パラレルGCによるGC制御を有効にするオプションです。

  JDK/JRE 5.0、6のFJVMの場合は、デフォルトでこのGC処理が実行されます。

図6 JDK/JRE 5.0、6でパラレルGCを有効にする場合に指定するオプション

-XX:+UseParallelGC

  図7はパラレルGC使用時に利用可能となる「Javaヒープのチューニング用オプション」です。

7 Javaヒープチューニング用オプション(パラレルGC使用時

-Xms
-Xmx
-XX:NewSize
-XX:MaxNewSize
-XX:NewRatio
-XX:PermSize
-XX:MaxPermSize

JDK/JRE 1.4の場合

  JDK/JRE 1.4のFJVMでは、パラレルGCはサポート対象外のGC処理です。

JVMPIとJVMTI

  次の場合、Java Virtual Machine Profiling Interface(JVMPI)をサポートしていません。

  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処理用スレッドの数を抑制する場合には、図8のオプションでGC処理用スレッドの数を指定することにより、GC処理用スレッドの数を抑制することができます。
  なおGC処理用スレッドの数を抑制した分だけGC処理における性能がおちる場合もありますので、このオプションを用いる場合には、十分な性能確認を実施してください。また、一般的に、CPU数以上の数のGC処理用スレッドを作成しても、GC処理における性能向上にはつながりません。

8 パラレルGCで使用するGC処理用スレッドの数を指定するオプション

-XX:ParallelGCThreads=GC処理用スレッドの数(0を指定した場合は搭載CPU数)

メモリ割り当てプールの省略値自動調整機能

  FJVMパラレルGCでは、JDK/JRE 5.0、6の機能であるエルゴノミクス機能によるメモリ割り当てプールの初期値(-Xms)および最大値(-Xmx)の省略値自動調整機能(マシンの物理メモリ量などに応じて、-Xmsおよび-Xmxの各オプションに対する省略値を自動的に決定する機能)を無効にしています。

  JDK/JRE 5.0、6のFJVMで、エルゴノミクス機能によるメモリ割り当てプールの省略値自動調整機能を有効にする場合は、図9のオプションを指定してください。

  ただし、このオプション指定は、システムのメモリ資源不足の要因となる場合があるため、システム内に複数のJavaプロセスを起動、実行する場合には使用しないでください。

9 JDK/JRE 5.0、6でメモリ割り当てプールの省略値自動調整機能を有効にするオプション

-XX:+AutomaticallyJavaHeapSizeSetting

メモリ領域不足事象の検出機能

  FJVMパラレルGCでは、JDK/JRE 5.0、6の機能であるエルゴノミクス機能によるメモリ領域不足事象の検出機能(図10の各オプション指定値による条件が同時に成立した場合に、メモリ領域不足事象(java.lang.OutOfMemoryError)として検出する機能)を無効にしています。

  JDK/JRE 5.0、6のFJVMでエルゴノミクス機能によるメモリ領域不足事象検出機能を有効にする場合は、図11のオプション(使用するJDK/JREの違いにより異なるため注意が必要です)を指定してください。

  ただし、このオプション指定で検出されるメモリ領域不足事象は、Javaヒープの使用量だけではなく、メモリ領域不足事象検出用オプションで指定された値、およびガーベジコレクション処理の動作状況から得られた統計情報などを元に決定されるため、Javaヒープの使用量が不足していない状態であっても、 メモリ領域不足事象が検出される場合がありますので注意してください。

10 メモリ領域不足事象検出条件

-XX:GCTimeLimit=GC処理に要する時間の上限値 (デフォルトは98)
Javaアプリケーションの合計処理時間に対して、GC処理に要した時間の上限値をパーセント単位(%)で指定します。
指定された上限値を超えた場合、検出条件の一方が成立します。

-XX:GCHeapFreeLimit=GC処理後のJavaヒープ量の空きスペースの下限値 (デフォルトは2)
メモリ割り当てプールの最大値に対する、GC処理後のJavaヒープ量の空きスペースの下限値をパーセント単位(%)で指定します。
指定された下限値を下回った場合、検出条件の一方が成立します。

11 JDK/JRE 5.0、6メモリ領域不足事象検出を有効にするオプション

【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(CMS付きパラレルGC)

  New世代領域用GC制御を並列化して実行する機能、およびJavaアプリケーションと同時並列に動作するOld世代領域用GC制御「コンカレント・マーク・スイープGC(CMS-GC)機能」を追加して構成されたGC処理です。CMS-GC機能を追加されたパラレルGC制御であることから、このGCをCMS付きパラレルGCと呼ぶ場合もあります。
  図12のオプションは、CMS付きパラレルGCによるGC制御を有効にするオプションです。

CMS付きパラレルGC

  CMS付きパラレルGCによるGC制御は、以下のエディションに搭載されたJDK/JRE 5.0、6にだけ提供しています。

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アプリケーションとしての動作が停止している場合があります。

図12 JDK/JRE 5.0、6でCMS付きパラレルGCを有効に場合に指定するオプション

-XX:UseFJcmsGC=タイプ
タイプとして以下の値が指定できます

type0
type1
type2

-XX:UseFJcmsGC=type0が指定された場合

  図13は-XX:UseFJcmsGC=type0指定時に利用可能となる「Javaヒープのチューニング用オプション」です。図13に示すチューニング用オプションを用いて、利用者が細かくチューニング作業を行なうことが可能なCMS付きパラレルGCを使用する場合に指定します。


図13 Javaヒープチューニング用オプション(-XX:UseFJcmsGC=type0指定時

-Xms
-Xmx
-XX:NewSize
-XX:MaxNewSize
-XX:SurvivorRatio
-XX:TargetSurvivorRatio
-XX:PermSize
-XX:MaxPermSize

-XX:UseFJcmsGC=type1が指定された場合

  New世代領域用GCでのオブジェクト回収を重視した調整が成されたCMS付きパラレルGCを使用する場合に指定します。

  実行されるアプリケーションの特徴が「大半のオブジェクトが、少ない回数のNew世代領域用GCによって回収されるオブジェクト」である場合に、CMS-GCによる応答性能平準化の改善効果が得やすい調整になっています。
Javaヒープのチューニングを行なう場合は、まず-Xms/-Xmxおよび-XX:PermSize/-XX:MaxPermSizeの各オプションにより、メモリ割り当てプールおよびPermanent世代領域の大きさを調整します。そして必要に応じて、-XX:NewSize/-XX:MaxNewSizeの各オプションでNew世代領域の大きさを調整します。

  なおNew世代領域サイズとして、メモリ割り当てプール最大サイズ未満の値を指定できます。ただしNew世代領域サイズを大きくしすぎると、Full GCが発生しやすくなってしまうので注意が必要です。

  図14は-XX:UseFJcmsGC=type1指定時に利用可能となる「Javaヒープのチューニング用オプション」です。

図14 Javaヒープチューニング用オプション(-XX:UseFJcmsGC=type1指定時

-Xms
-Xmx
-XX:NewSize
-XX:MaxNewSize
-XX:PermSize
-XX:MaxPermSize

-XX:UseFJcmsGC=type2が指定された場合

  CMS-GCでのオブジェクト回収を重視した調整が成されたCMS付きパラレルGCを使用する場合に指定します。

  実行されるアプリケーションの特徴が「大半のオブジェクトが、何回かのGCを経てから回収される(長期間常駐せず、ある程度の短期間で回収される)オブジェクト」である場合に、CMS-GCによる応答性能平準化の改善効果が得やすい調整になっています。

  Javaヒープのチューニングを行なう場合は、まず-Xms/-Xmxおよび-XX:PermSize/-XX:MaxPermSizeの各オプションにより、メモリ割り当てプールおよびPermanent世代領域の大きさを調整します。そして必要に応じて、-XX:NewSize/-XX:MaxNewSizeの各オプションでNew世代領域の大きさを調整します。

  なおNew世代領域サイズとして、メモリ割り当てプール最大サイズ未満の値を指定できます。ただしNew世代領域サイズを大きくしすぎると、Full GCが発生しやすくなってしまうので注意が必要です。

  図15は-XX:UseFJcmsGC=type2指定時に利用可能となる「Javaヒープのチューニング用オプション」です。

図15 Javaヒープチューニング用オプション(-XX:UseFJcmsGC=type2指定時

-Xms
-Xmx
-XX:NewSize
-XX:MaxNewSize
-XX:PermSize
-XX:MaxPermSize

JDK/JRE 1.4の場合

  JDK/JRE 1.4のFJVMでは、CMS付きパラレルGCはサポート対象外のGC処理です。

JVMPIとJVMTI

  次の場合、Java Virtual Machine Profiling Interface(JVMPI)をサポートしていません。

  JVMPI相当の機能を使用する場合には、JDK/JRE 5.0から導入されたJava Virtual Machine Tool Interface(JVMTI)を使用してください。

  JDK/JRE 5.0でJVMPI機能は推奨されていません。やむを得ず使用する場合は、GC処理としてシリアルGCを使用してください。

JDK/JRE 5.0のJVMTI

  JDK/JRE 5.0を使用し、GC処理としてCMS付きパラレルGCが選択されている場合、Java Virtual Machine Tool Interface(JVMTI)で、以下の権限を必要とする機能は使用できません。

GC処理用スレッド数

  CMS付きパラレルGCを使用した場合は、実行するハードウェアに搭載しているCPU数に依存した数のGC処理用スレッドがJavaプロセス内に作成されます。そのため、GC処理用スレッドの数分だけ、スタック域などのスレッド用のメモリ領域が必要となります。
  Javaプロセス内でのメモリ量を抑えるためなど、GC処理用スレッドの数を調整する場合には、図16のオプションでGC処理用スレッドの数を指定することにより、GC処理用スレッドの数を調整することができます。
  なおGC処理用スレッドの数を抑制した分だけGC処理における性能がおちる場合もありますので、このオプションを用いる場合には、十分な性能確認を実施してください。また、一般的に、CPU数以上の数のGC処理用スレッドを作成しても、GC処理における性能向上にはつながりません。

図16 CMS付きパラレルGCで使用するGC処理用スレッドの数を指定するオプション

-XX:ParallelGCThreads=New世代領域GC用スレッドの数
New世代領域用GC処理を行なうGCスレッドの数を指定します。
最小値は「2」です。
「0」または「1」が指定された場合は、デフォルト値となります。
デフォルト値は以下のとおりです。

- 実行するハードウェアに搭載しているCPU数が1の場合 = 2
- 実行するハードウェアに搭載しているCPU数が2以上7以下の場合 = CPU数分
- 実行するハードウェアに搭載しているCPU数が8以上の場合 = 8

■デフォルトの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を提供していません。