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

10.4.1 Javaヒープおよびメタスペースのチューニング

Javaヒープおよびメタスペースのチューニング方法および、チューニングによる影響範囲を説明します。

チューニング方法

Javaヒープおよびメタスペースの各領域のサイズは、“表10.3 Javaヒープおよびメタスペースに関するオプション”に示すオプションをJava起動時に指定することで設定ができます。

メモリ割り当てプールのデフォルトの初期値および最大値を、“表10.4 メモリ割り当てプールのデフォルトのサイズ”に示します。
また、初めて超えたときにFullGCを発生させるしきい値となるメタスペースのサイズを、“表10.5 初めて超えたときにFullGCを発生させるしきい値となるメタスペースのサイズ”に示します。
また各オプションにおいて、“表10.3 Javaヒープおよびメタスペースに関するオプション”中に記載されていないデフォルト値を、“表10.6 Javaヒープに関するオプション(-XX:NewSize/-XX:NewRatio)のデフォルト値”に示します。

表10.3 Javaヒープおよびメタスペースに関するオプション

オプション

オプションの機能 (注1)

-Xms

メモリ割り当てプールの初期値を指定します。
たとえば、メモリ割り当てプールの初期値を128MBに設定する場合、“-Xms128m”と指定します。
本オプションのデフォルト値は“表10.4 メモリ割り当てプールのデフォルトのサイズ”のとおりです。

なお、指定値が1MB未満の場合、または-XX:NewSizeオプションの値(デフォルト値を含む)以下の場合、初期化エラーとなり、Javaプロセスは終了します。

-Xmx

メモリ割り当てプールの最大値を指定します。
たとえば、メモリ割り当てプールの最大値を256MBに設定する場合、“-Xmx256m”と指定します。
(実際に使用される値は、ページサイズなどのシステム情報を元に、Java VMによる制御が最適となるように調整された値「調整値」となるため、指定された値と若干異なる場合があります。)
本オプションのデフォルト値は“表10.4 メモリ割り当てプールのデフォルトのサイズ”のとおりです。

なお、指定値(または調整値)が、-Xmsオプションで指定された値よりも小さな値の場合、初期化エラーとなり、Javaプロセスは終了します。

-XX:NewSize

New世代領域のヒープサイズを指定します。
たとえば、New世代領域のヒープサイズを128MBに設定する場合、“-XX:NewSize=128m”と指定します。
本オプションのデフォルト値は“表10.6 Javaヒープに関するオプション(-XX:NewSize/-XX:NewRatio)のデフォルト値”のとおりです。

なお、指定値がJava VMとしての下限値未満の場合、初期化エラーとなり、Javaプロセスは終了します。そのため、本オプションを指定する場合は、1MB以上の値を指定してください。

-XX:MaxNewSize

New世代領域の最大ヒープサイズを設定します。
たとえば、New世代領域の最大ヒープサイズを128MBに設定する場合、“-XX:MaxNewSize=128m”と指定します。
本オプションのデフォルト値はありません。

なお、指定値が、-XX:NewSizeオプションで指定された値よりも小さな値の場合は、-XX:NewSizeオプションで指定された値となります。

-XX:NewRatio

New世代領域Old世代領域のサイズ比率を指定します。
たとえば、New世代領域Old世代領域のサイズ比率を2とする場合、“-XX:NewRatio=2”と指定します。
本オプションの指定が有効な場合のデフォルト値は“表10.6 Javaヒープに関するオプション(-XX:NewSize/-XX:NewRatio)のデフォルト値”のとおりです。

-XX:SurvivorRatio (注2)

New世代領域を構成するEden領域Survivor領域のサイズ比率を指定します。
たとえば、Eden領域Survivor領域のサイズ比率を8とする場合、“-XX:SurvivorRatio=8”と指定します。
本オプションの指定が有効な場合のデフォルト値は8です。

-XX:TargetSurvivorRatio (注2)

ガーベジコレクション(GC)処理後の生存オブジェクトがSurvivor領域を占める割合を、指定したパーセンテージ値に調整します。
たとえば、GC処理後の生存オブジェクトがSurvivor領域を占める割合を半分とする場合、“-XX:TargetSurvivorRatio=50”と指定します。
本オプションの指定が有効な場合のデフォルト値は50です。

-XX:MetaspaceSize

初めて超えたときにFullGCを発生させるしきい値となるメタスペースのサイズを指定します。
たとえば、値を32MBに設定する場合、“-XX:MetaspaceSize=32m”と指定します。
指定できる範囲は以下になります。

  • 32ビットモードのJDK/JRE 8の場合
    256KB以上かつ、4GB未満

  • 64ビットモードのJDK/JRE 8の場合
    256KB以上かつ、8,589,934,592GB未満


本オプションのデフォルト値は“表10.5 初めて超えたときにFullGCを発生させるしきい値となるメタスペースのサイズ”のとおりです。
なお、指定値(または調整値)が、-XX:MaxMetaspaceSizeオプションで指定された値よりも大きな値の場合は、-XX:MaxMetaspaceSizeオプションで指定された値となります。

-XX:MaxMetaspaceSize

メタスペースの最大値を指定します。
たとえば、メタスペースの最大値を128MBに設定する場合、“-XX:MaxMetaspaceSize=128m”と指定します。
指定できる範囲は以下になります。

  • 32ビットモードのJDK/JRE 8の場合
    256KB以上かつ、4GB未満

  • 64ビットモードのJDK/JRE 8の場合
    256KB以上かつ、8,589,934,592GB未満


(実際に使用される値は、ページサイズなどのシステム情報を元に、Java VMによる制御が最適となるように調整された値「調整値」となるため、指定された値と若干異なる場合があります。)
オプションが指定されなかった場合は無制限(OSが領域を獲得できれば上限なし)に設定されます。

-XX:CompressedClassSpaceSize

64ビットモードのJDK/JRE 8 の場合に、Compressed Class Space の最大値を指定します。
たとえば、値を512MBに設定する場合、“-XX:CompressedClassSpaceSize=512m”と指定します。デフォルトサイズは、1GBです。

注1)

サイズを指定するオプションでは単位として次の文字を指定できます。
KB(キロバイト)を指定する場合: “k”または“K”
MB(メガバイト)を指定する場合: “m”または“M”
GB(ギガバイト)を指定する場合: “g”または“G”

注2)

パラレルGCを使用する場合、このオプションへの指定値は無効となります。

表10.4 メモリ割り当てプールのデフォルトのサイズ

OS

JDK/JREの実行モード

GC処理

初期値

最大値

Windows
Linux for x86
Linux for Intel64

32ビットモード

シリアルGC

6.0MB

96MB

パラレルGC (注1)

6.0MB

CMS付きパラレルGC

6.0MB

Windows Server(R) x64 Editions
Linux for Intel64

64ビットモード

シリアルGC

8.0MB

126MB

パラレルGC (注1)

8.0MB

CMS付きパラレルGC

8.0MB

Solaris

64ビットモード

シリアルGC

8.0MB

128MB

パラレルGC (注1)

8.0MB

CMS付きパラレルGC

8.0MB

注1)

デフォルトで使用されるGC処理です。

表10.5 初めて超えたときにFullGCを発生させるしきい値となるメタスペースのサイズ

OS

JDK/JREの実行モード

Java VM

FullGCのしきい値

Windows
Linux for x86
Linux for Intel64

32ビットモード

Java HotSpot Client VM

12MB

FJVM (注1)

16MB

Windows Server(R) x64 Editions
Linux for Intel64
Solaris

64ビットモード

FJVM (注1)

20.796875MB

注1)

デフォルトで使用されるJava VMです。

注意

64ビットモードのJDK/JRE 8では、通常のメタスペースの他に、クラス情報の一部を格納するCompressed Class Space と呼ばれる領域を使用します。この領域は、Java VM起動時に1GBのサイズだけリザーブされます。

表10.6 Javaヒープに関するオプション(-XX:NewSize/-XX:NewRatio)のデフォルト値

OS

JDK/JREの実行モード

Java VM

-XX:NewSize

-XX:NewRatio

Windows
Linux for x86
Linux for Intel64

32ビットモード

Java HotSpot Client VM

2048KB

2

FJVM (注1)

Windows Server(R) x64 Editions
Linux for Intel64
Solaris

64ビットモード

FJVM (注1)

パラレルGCの場合: 2560KB
シリアルGC、CMS付きパラレルGCの場合: 2688KB

注1)

デフォルトで使用されるJava VMです。

チューニングの方針

Javaヒープをチューニングする際、次の方針があります。

  1. FullGCを実行したにもかかわらず、メモリ不足が発生する場合、GCのログを採取し、メモリ割り当てプールまたはメタスペースのどちらかの領域が不足しているかどうかを確認します。

  2. FullGCはコストがかかります。このため、メモリ不足が発生しなくても、Javaアプリケーションがハングアップしたかのように一時的に無反応になる場合、FullGCの影響を受けている場合があります。GCのログを採取し、Javaヒープが必要以上に大きなサイズになっていれば、Javaヒープのサイズを縮小する方針でチューニングします。

  3. 効率的なNew GCに対して、FullGCはコストがかかります。このため、New世代領域Old世代領域のサイズのバランスを考慮する必要があります。なお、GC処理としてパラレルGCを使用する場合は、JavaヒープのNew世代領域およびOld世代領域の大きさに関する値が自動的に調整および最適化されるため、通常はこのバランスを考慮する必要はありません。

  4. 仮想メモリに余裕がある場合は、Javaプロセスを複数起動して、プロセス多重度を上げる方法を検討します。プロセス多重度を上げることにより、プロセスごとのユーザ空間を有効に使うことが可能になります。ただし、メモリのスワッピングによるスローダウンに注意する必要があります。

チューニングの影響範囲

メモリ割り当てプールの大きさ(-Xmxオプションの指定値)や、New世代領域とOld世代領域の大きさのバランスを変更した場合の影響範囲を、次に示します。

注意

overcommit memory機能が有効な場合の注意事項

「overcommit memory機能」が有効な場合、Linuxは、Javaヒープの各領域の最大値に相当する仮想メモリ資源を、Java VMの起動時に、Javaプロセスに対して予約します。
このため、-Xms値と-Xmx値を異なる値にしてJavaプロセスを起動する場合、本機能の有効/無効によって、Javaプロセス起動時にJavaヒープとして必要となる仮想メモリの量が異なります。

  • overcommit memory機能が無効、またはovercommit memory機能がないシステムの場合

    Javaヒープ用仮想メモリ量 = 「-Xms値」

  • overcommit memory機能が有効なシステムの場合

    Javaヒープ用仮想メモリ量 = 「-Xmx値」

この結果、仮に同量の仮想メモリ資源を持つシステムの場合であっても、本機能の有効/無効によって、同時に起動できるJavaプロセスの数が異なる場合があります。
Linuxで仮想メモリ資源の見積もりを行う場合には、overcommit memory機能の有無に注意してください。