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

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

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

チューニング方法

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

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

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

オプション

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

-Xms

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

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

-Xmx

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

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

-XX:NewSize

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

本オプションを指定する場合は、1MB以上の値を指定してください。なお、指定値が1MBよりも小さい値の場合は、初期化エラーとなり、Javaプロセスが異常終了することがあります。

-XX:MaxNewSize

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

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

-XX:NewRatio

New世代領域とOld世代領域のサイズ比率を指定します。
たとえば、New世代領域とOld世代領域のサイズ比率を2とする場合、“-XX:NewRatio=2”と指定します。
本オプションの指定が有効な場合のデフォルト値は“表7.4 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”と指定します。
指定できる範囲は、256KB以上かつ、8,589,934,592GB未満です。
本オプションのデフォルト値は、20.796875MBです。
なお、指定値(または調整値)が、-XX:MaxMetaspaceSizeオプションで指定された値よりも大きな値の場合は、-XX:MaxMetaspaceSizeオプションで指定された値となります。

-XX:MaxMetaspaceSize

メタスペースの最大値を指定します。
たとえば、メタスペースの最大値を128MBに設定する場合、“-XX:MaxMetaspaceSize=128m”と指定します。
指定できる範囲は、256KB以上かつ、8,589,934,592GB未満です。

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

-XX:CompressedClassSpaceSize

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

注1)
  • サイズを指定するオプションでは単位として次の文字を指定できます。

    • KB(キロバイト)を指定する場合: “k”または“K”

    • MB(メガバイト)を指定する場合: “m”または“M”

    • GB(ギガバイト)を指定する場合: “g”または“G”

  • 各オプションのデフォルト値は、そのオプションを指定しなかった場合に設定される数値でしかなく、実際にその値がメモリの初期/最大値、しきい値、領域の比率になるとは限りません。

注2)

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

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

OS

初期値

最大値

Windows Server(R) x64 Editions
Linux for Intel64

8.0MB

126MB

Solaris

8.0MB

128MB

注意

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

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

-XX:NewSize

-XX:NewRatio(注1)

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

2

注意

-XX:NewRatio(注1)

CMS付きパラレルGCを使用しているかつ、-Xmsオプションを指定した場合、New世代領域の大きさがJava VMによる制御が最適となるように調整した値になります。
このため、New世代領域とOld世代領域のサイズ比率がデフォルト値となることを期待してオプションを指定していない場合は、意図しない動作となることがあるため、オプションを指定してチューニングしてください。

チューニングの方針

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機能の有無に注意してください。