ここでは、FJVMで実装しているNew世代領域サイズ自動調整機能について説明します。
なお、次のFJVMでは、New世代領域サイズ自動調整機能を提供していません。
実行モードが64ビットモードのFJVM
JDK/JRE 6のFJVM
 JDK/JRE 1.4のFJVM
 JDK/JRE 1.4のFJVM
JDK/JRE 1.4のFJVMにおけるデフォルトのGC処理は、FJGC(実行モードが32ビットモードの場合)またはシリアルGC(実行モードが64ビットモードの場合(ただし、Windows Server(R) 2003 for Itanium-based SystemsおよびRHEL-AS4(IPF)にのみ対応))です。
 JDK/JRE 5.0、6のFJVM
 JDK/JRE 5.0、6のFJVM
JDK/JRE 5.0、6のFJVMにおけるデフォルトのGC処理は、パラレルGCです。
■New世代領域サイズ自動調整機能
FJVMでは、富士通独自技術により、JavaヒープのNew世代領域のサイズを自動的に調整および最適化する機能を実装しています。この機能を、New世代領域サイズ自動調整機能(以降、自動調整機能と略する)といいます。
■New世代領域サイズ自動調整機能が有効となる条件
  自動調整機能は、“メモリ割り当てプールの最大サイズ”が図1に示す値の範囲内である場合に有効となります。(“メモリ割り当てプールの最大サイズ”は、“-Xmx”オプションで指定できます。)
  “メモリ割り当てプールの最大サイズ”が図1で示す範囲よりも大きな値である場合は、FJVM起動時に図2のメッセージが標準出力へ出力され、自動調整機能は停止状態となります。
  自動調整機能が停止状態となった場合は、New世代領域の大きさに対する自動調整処理は行なわれず、表1の注1で示すオプションに関する制御処理を除き、シリアルGCでの制御処理と同じ処理方法でNew世代領域の大きさが制御されるようになります。
図1 自動調整機能が有効となるメモリ割り当てプールの最大サイズ
| 
 【Windows(R) 2000の場合】 【Windows Server(R) 2003、Windows Server(R) 2008、Windows(R) XPまたはWindows Vista(R)の場合】  
 
 | 
図2 自動調整機能停止時に出力されるメッセージ
| Heap too large for dynamic eden: using static eden | 
■New世代領域サイズ自動調整機能で無効となるオプション
  自動調整機能が有効な場合、New世代領域の大きさに関する値が自動的に調整・最適化されるため、表1の各オプションへの指定値は無効となります。
  なお、実行モードが64ビットモードのFJVMでは自動調整機能を提供していないため、Java HotSpot Server VMと同様、“表7.2 自動調整機能で無効となるオプション”の各オプションへの指定値は有効となります。
| オプション | オプションの機能 | 
|---|---|
| -XX:NewSize | New世代領域のヒープサイズを指定します。 | 
| -XX:MaxNewSize | New世代領域の最大ヒープサイズを設定します。 | 
| -XX:NewRatio | New世代領域とOld世代領域のサイズ比率を指定します。 | 
| -XX:SurvivorRatio (注1) (注2) | New世代領域を構成するEden領域とSurvivor領域のサイズ比率を指定します。 | 
| -XX:TargetSurvivorRatio (注1) (注2) | GC処理後の生存オブジェクトがSurvivor領域を占める割合を、指定したパーセンテージ値に調整します。 | 
注1) 図1で示す範囲よりも大きな値を“-Xmx”オプションで指定して自動調整機能が停止した場合でも、このオプションへの指定値は無効となります。
注2) パラレルGCの場合は、このオプションへの指定値は無効となります。
■New世代領域サイズ自動調整機能の無効化
自動調整機能は図3のオプションを指定することで無効にすることができます。
図3 自動調整機能を無効にするオプション
| -XX:-UseFJGC | 
JDK/JRE 1.4のFJVMを使用している場合で、かつ以下のような場合には、自動調整機能を無効にし、シリアルGCを使用してください。
また、JDK/JRE 5.0のFJVMで自動調整機能を有効にしている場合で、かつ以下のような場合には、自動調整機能を有効にするオプションを削除し、パラレルGCまたはシリアルGCを使用してください。
Javaヒープに対するチューニングを手動で行いたい場合:
Java HotSpot Server VMを使用する場合と同じように、表1の各オプションを用いてJavaヒープに対するチューニングを行いたい場合には、自動調整機能を無効にしてください。
ネイティブモジュールで使用するメモリ量をある程度確保する必要がある場合:
  自動調整機能が有効な場合、当該機能が使用する作業域(“-Xmx”オプションで指定した値の2/3の大きさ)をユーザ空間から確保(リザーブ処理だけの確保)しています。
  そのため、“-Xmx”オプションで図1に示す範囲内でかつその上限値近くの値を指定した場合、自動調整機能が使用する作業域確保のため、ネイティブモジュールから使用できるスタックやヒープなどのメモリ量が非常に少なくなっています。
  図1に示す範囲の上限値近くの値のメモリ割り当てプールの大きさを確保し、かつネイティブモジュールで使用するスタックやヒープなどのセグメントに対するメモリ量もある程度確保する必要がある場合には、自動調整機能を無効にしてください。
Javaプロセスのユーザ空間から連続域の状態で確保できるメモリ量が小さいシステムの場合:
  自動調整機能が有効な場合、メモリ割り当てプールと自動調整機能用の作業域を連続域としてユーザ空間から確保しています。
  また、ユーザ空間から連続域として確保できる最大メモリ量は、システムごとに異なります。
  そのため、“-Xmx”オプションで指定したメモリ割り当てプールの大きさが図1に示す値の範囲内であっても、Javaプロセスのユーザ空間から、メモリ割り当てプールと自動調整機能用の作業域が連続域として確保できない場合には(Javaプロセスのユーザ空間から、連続域の状態で確保できるメモリ量が小さいシステムの場合には)、Java VMは図4のメッセージを出力して、Javaアプリケーションの実行を中止します。
  その場合は、より小さな値を“-Xmx”オプションで指定するか、自動調整機能を無効にしてください。
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の発生傾向が強い場合は、自動調整機能を無効にしてください。
なおGC処理の実行が抑止される機能については“7.1.5 Javaヒープとガーベジコレクション”を参照してください。
■補足
ユーザ空間内で使用できるメモリ量には、システムごとに異なる上限値があります。
そして、Javaアプリケーションを実行する場合には、Javaヒープ(“-Xmx”オプションで指定するメモリ割り当てプールなど)のほかに、Javaアプリケーション自身、Java VM、そしてネイティブモジュールが動作するために使用するメモリ領域も必要です。
そのため、ユーザ空間内で使用できるメモリ量の上限から、Javaアプリケーション自身、Java VM、そしてネイティブモジュールが使用するメモリ量などを差し引いた値がJavaヒープとして使用できる上限となります。
  “-Xmx”オプションなどにより、その上限を超える値をJavaヒープの大きさとして指定した場合、Java VMは以下のメッセージを出力し、Javaアプリケーションの実行を中止します。
  また、自動調整機能が有効な場合には、メモリ割り当てプールと自動調整機能用の作業域が連続域として確保できない場合にも、Java VMは以下のメッセージを出力し、Javaアプリケーションの実行を中止します。
図4 Javaヒープなどが確保できない場合のメッセージ
| Error occurred during initialization of VM | 
またSolaris用およびLinux用のJava VM起動時にメモリ不足(「ユーザ空間不足」または「仮想メモリ不足」)が発生した場合、Java VMは以下のメッセージを出力し、Javaアプリケーションの実行を中止します。
図5 Java VM起動時にメモリ不足が発生した場合のメッセージ
| 制御名: mmap failed: errno=エラー情報, 制御情報.... | 
制御名    :  メモリ不足が発生した際のJava VMの制御名
エラー情報:メモリ不足が発生した際のJava VMのエラー情報
制御情報  :  メモリ不足が発生した際のJava VMの制御情報
  ユーザ空間が不足している場合は、Javaヒープを小さくするチューニングを行ってください。
  仮想メモリが不足している場合は、他の不要なプロセスを終了して仮想メモリに余裕を持たせるか、物理メモリ(RAM)またはスワップファイルを拡張して仮想メモリを増やすようにチューニングを行ってください。