本節では、Javaヒープのチューニング方法および、チューニングによる影響範囲を説明します。
■チューニング方法
Javaヒープの各領域のサイズは、“表7.6 Javaヒープに関するオプション”に示すオプションをJava起動時に指定することで設定ができます。
なお、メモリ割り当てプールのデフォルトの初期値および最大値を、“表7.7 メモリ割り当てプールのデフォルトのサイズ”に示します。
また、Permanent世代領域のデフォルトの初期値および最大値を、“表7.8 Permanent世代領域のデフォルトのサイズ”に示します。
オプション | オプションの機能 |
---|---|
-Xms | メモリ割り当てプールの初期値を指定します。 |
-Xmx | メモリ割り当てプールの最大値を指定します。 |
-XX:NewSize (注1) | New世代領域のヒープサイズを指定します。 |
-XX:MaxNewSize (注1) | New世代領域の最大ヒープサイズを設定します。 |
-XX:NewRatio (注1) | New世代領域とOld世代領域のサイズ比率を指定します。 |
-XX:SurvivorRatio (注1)(注2) | New世代領域を構成するEden領域とSurvivor領域のサイズ比率を指定します。 |
-XX:TargetSurvivorRatio (注1) (注2) | ガーベジコレクション(GC)処理後の生存オブジェクトがSurvivor領域を占める割合を、指定したパーセンテージ値に調整します。 |
-XX:PermSize | Permanent世代領域の初期値を指定します。 |
-XX:MaxPermSize | Permanent世代領域の最大値を指定します。 |
注1) FJGCを使用する場合、このオプションへの指定値は無効となります。
注2) パラレルGCを使用する場合、このオプションへの指定値は無効となります。
注3) サイズを指定するオプションでは単位として次の文字を指定できます。
KB(キロバイト)を指定する場合:”k”または”K”
MB(メガバイト)を指定する場合:”m”または”M”
JDK/JREのバージョン | OS | JDK/JREの実行モード | GC処理 | 初期値 | 最大値 |
---|---|---|---|---|---|
JDK/JRE 1.4 | Windows (ただし、Windows Server(R) for Itanium-based Systemsを除く) RHEL-AS4(x86)/AS4(EM64T) | 32ビットモード | シリアルGC | 2.0MB | 64MB |
Solaris | 32ビットモード | シリアルGC | 3.5MB | ||
Windows Server(R) 2003 for Itanium-based Systems | 64ビットモード | シリアルGC (注1) | 3.5MB | ||
JDK/JRE 5.0 | Windows Linux for x86 Linux for Intel64 | 32ビットモード | シリアルGC | 2.0MB | 64MB |
パラレルGC (注1) | 5.375MB | ||||
Solaris | 32ビットモード | シリアルGC | 3.5MB | ||
パラレルGC (注1) | 5.375MB | ||||
Windows Server(R) x64 Editions Linux for Intel64 | 64ビットモード | シリアルGC | 4.3125MB | 84MB | |
パラレルGC (注1) | 5.75MB | ||||
Windows Server(R) for Itanium-based Systems Linux for Itanium | 64ビットモード | シリアルGC | 4.5MB | 88MB | |
パラレルGC (注1) | 5.75MB | ||||
JDK/JRE 6 | Windows(ただし、Windows Server(R) for Itanium-based Systemsは除く) Linux for Intel64 | 32ビットモード | シリアルGC | 5.0MB | 64MB |
パラレルGC (注1) | 8.0MB | ||||
Solaris | 32ビットモード | シリアルGC | 6.125MB | ||
パラレルGC (注1) | 8.0MB | ||||
Windows Server(R) for x64 Editions RHEL5(Intel64) | 64ビットモード | シリアルGC | 7.75MB | 84MB | |
パラレルGC (注1) | 9.1875MB |
注1) デフォルトで使用されるGC処理です。
JDK/JREのバージョン | OS | JDK/JREの実行モード | Java VM | 初期値 | 最大値 |
---|---|---|---|---|---|
JDK/JRE 1.4 | Windows (ただし、Windows Server(R) for Itanium-based Systemsを除く) RHEL-AS4(x86)/AS4(EM64T) Solaris | 32ビットモード | Java HotSpot Client VM | 4MB | 64MB |
FJVM (注1) | 16MB | ||||
Windows Server(R) 2003 for Itanium-based Systems | 64ビットモード | FJVM (注1) | 16MB | ||
JDK/JRE 5.0 | Windows Linux for x86 Linux for Intel64 Solaris | 32ビットモード | Java HotSpot Client VM | 8MB | 64MB |
FJVM (注1) | 16MB | ||||
Windows Server(R) x64 Editions Linux for Intel64 | 64ビットモード | FJVM (注1) | 20.75MB | 84MB | |
Windows Server(R) for Itanium-based Systems Linux for Itanium | 88MB | ||||
JDK/JRE 6 | Windows(ただし、Windows Server(R) for Itanium-based Systemsは除く) Linux for Intel64 | 32ビットモード | Java HotSpot Client VM | 12MB | 64MB |
FJVM (注1) | 16MB | ||||
Windows Server(R) x64 Editions RHEL5(Intel64) | 64ビットモード | FJVM (注1) | 20.75MB | 84MB |
注1) デフォルトで使用されるJava VMです。
■チューニングの方針
Javaヒープをチューニングする際、次の方針があります。
FullGCを実行したにもかかわらず、メモリ不足が発生する場合、GCのログを採取し、メモリ割り当てプールまたはPermanent世代領域のいずれかの領域が不足しているかどうかを確認します。
FullGCはコストがかかります。このため、メモリ不足が発生しなくても、Javaアプリケーションがハングアップしたかのように一時的に無反応になる場合、FullGCの影響を受けている場合があります。GCのログを採取し、Javaヒープが必要以上に大きなサイズになっていれば、Javaヒープのサイズを縮小する方針でチューニングします。
効率的なNew世代GCに対して、FullGCはコストがかかります。このため、New世代領域とOld世代領域のサイズのバランスを考慮する必要があります。なお、FJVMでFJGCを使用する場合、New世代領域サイズ自動調整機能を実装しているため、通常はこのバランスを考慮する必要はありません。
仮想メモリに余裕がある場合は、Javaプロセスを複数起動して、プロセス多重度を上げる方法を検討します。プロセス多重度を上げることにより、プロセスごとのユーザ空間を有効に使うことが可能になります。ただし、メモリのスワッピングによるスローダウンに注意する必要があります。
■チューニングの影響範囲
Javaヒープ全体のサイズを変更した場合の影響範囲を、次に示します。
Javaヒープ全体のサイズを縮小した場合、GCが頻発することがあります。
Javaヒープ全体のサイズを拡張した場合、FullGCに時間がかかることがあります。
Javaヒープ全体のサイズを拡張した場合、その分ユーザ空間や仮想メモリが少なくなるため、スタックやネイティブモジュールの動作に必要な領域を確保できず、メモリ不足になることがあります。
overcommit memory機能が有効な場合の注意事項
「overcommit memory機能」が有効な場合、Linuxは、Javaヒープの各領域の最大値に相当する仮想メモリ資源を、Java VMの起動時に、Javaプロセスに対して予約します。
このため、-Xms値と-Xmx値を異なる値にしてJavaプロセスを起動する場合、本機能の有効/無効によって、Javaプロセス起動時にJavaヒープとして必要となる仮想メモリの量が異なります。
overcommit memory機能が無効、またはovercommit memory機能がないシステムの場合
Javaヒープ用仮想メモリ量 = 「-Xms値」 + 「Perm域初期値」
overcommit memory機能が有効なシステムの場合
Javaヒープ用仮想メモリ量 = 「-Xmx値」 + 「-XX:MaxPermSize値」
この結果、仮に同量の仮想メモリ資源を持つシステムの場合であっても、本機能の有効/無効によって、同時に起動できるJavaプロセスの数が異なる場合があります。
Linuxで仮想メモリ資源の見積もりを行う場合には、overcommit memory機能の有無に注意してください。