Interstage Application Server チューニングガイド
目次 索引 前ページ次ページ

第7章 JDK/JREのチューニング> 7.5 チューニング方法

7.5.2 Javaヒープのチューニング

 本節では、Javaヒープのチューニング方法および、チューニングによる影響範囲を説明します。

■チューニング方法

 Javaヒープの各領域のサイズは、表1に示すオプションで指定することができます。

 なお、メモリ割り当てプールのデフォルトの初期値および最大値を、表2に示します。
 また、Permanent世代領域のデフォルトの初期値および最大値を、表3に示します。

[表1 Javaヒープに関するオプション]

オプション

オプションの機能

-Xms

メモリ割り当てプールの初期値を指定します。
たとえば、メモリ割り当てプールの初期値を128MBに設定する場合、"-Xms128m"と指定します。

-Xmx

メモリ割り当てプールの最大値を指定します。
たとえば、メモリ割り当てプールの最大値を256MBに設定する場合、"-Xmx256m"と指定します。

-XX:NewSize(注1)

New世代領域のヒープサイズを指定します。
たとえば、New世代領域のヒープサイズを128MBに設定する場合、"-XX:NewSize=128m"と指定します。

-XX:MaxNewSize(注1)

New世代領域の最大ヒープサイズを設定します。
たとえば、New世代領域の最大ヒープサイズを128MBに設定する場合、"-XX:MaxNewSize=128m"と指定します。

-XX:NewRatio(注1)

New世代領域Old世代領域のサイズ比率を指定します。
たとえば、New世代領域Old世代領域のサイズ比率を2とする場合、"-XX:NewRatio=2"と指定します。

-XX:SurvivorRatio(注1)

New世代領域を構成するEden領域Survivor領域のサイズ比率を指定します。
たとえば、Eden領域Survivor領域のサイズ比率を8とする場合、"-XX:SurvivorRatio=8"と指定します。

-XX:TargetSurvivorRatio(注1)

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

-XX:PermSize

Permanent世代領域の初期値を指定します。
たとえば、Permanent世代領域の初期値を32MBに設定する場合、"-XX:PermSize=32m"と指定します。

-XX:MaxPermSize

Permanent世代領域の最大サイズを指定します。
たとえば、Permanent世代領域の最大値を128MBに設定する場合、"-XX:MaxPermSize=128m"と指定します。

注1) FJGCを使用する場合、このオプションへの指定値は無効となります。
注2) サイズを指定するオプションでは単位として次の文字を指定できます。
   KB(キロバイト)を指定する場合:"k"または"K"
   MB(メガバイト)を指定する場合:"m"または"M"

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

 

OS

初期値

最大値

JDK/JRE 1.3

Solaris

3.5MB

64MB

Solaris以外

2.0MB

JDK/JRE 1.4

Solaris、RHEL-AS4(IPF)

3.5MB

64MB

Solaris、RHEL-AS4(IPF)以外

2.0MB

[表3 Permanent世代領域のデフォルトのサイズ]

 

初期値

最大値

JDK/JRE 1.3

1MB

32MB (Java HotSpot Client VM)
64MB (FJVM)

JDK/JRE 1.4

4MB (Java HotSpot Client VM)
16MB (FJVM)

64MB

■チューニングの方針

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

  1. FullGCを実行したにも関わらず、メモリ不足が発生する場合、GCのログを採取し、メモリ割り当てプールまたはPermanent世代領域のいずれかの領域が不足しているかどうかを確認します。
  2. FullGCはコストがかかります。このため、メモリ不足が発生しなくても、Javaアプリケーションがハングアップしたかのように一時的に無反応になる場合、FullGCの影響を受けている場合があります。GCのログを採取し、Javaヒープが必要以上に大きなサイズになっていれば、Javaヒープのサイズを縮小する方針でチューニングします。
  3. 効率的なNew世代GCに対して、FullGCはコストがかかります。このため、New世代領域Old世代領域のサイズのバランスを考慮する必要があります。なお、FJVMでFJGCを使用する場合、New世代領域サイズ自動調整機能を実装しているため、通常はこのバランスを考慮する必要はありません。
  4. 仮想メモリに余裕がある場合は、Javaプロセスを複数起動して、プロセス多重度を上げる方法を検討します。プロセス多重度を上げることにより、プロセスごとのユーザ空間を有効に使うことが可能になります。ただし、メモリのスワッピングによるスローダウンに注意する必要があります。

■チューニングの影響範囲

 Javaヒープ全体のサイズを変更した場合の影響範囲を、次に示します。

  1. Javaヒープ全体のサイズを縮小した場合、GCが頻発することがあります。
  2. Javaヒープ全体のサイズを拡張した場合、FullGCに時間がかかることがあります。
  3. Javaヒープ全体のサイズを拡張した場合、その分ユーザ空間や仮想メモリが少なくなるため、スタックやネイティブモジュールの動作に必要な領域を確保できず、メモリ不足になることがあります。

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

 「overcommit memory機能」が有効な場合、Linuxは、Javaヒープの各領域の最大値に相当する仮想メモリ資源を、Java VMの起動時に、Javaプロセスに対して予約します。
 このため、-Xms値と-Xmx値を異なる値にしてJavaプロセスを起動する場合、本機能の有効/無効によって、Javaプロセス起動時にJavaヒープとして必要となる仮想メモリの量が異なります。
「Javaヒープ用仮想メモリ量」=「-Xmx値」+「-XX:MaxPermSize値」
 この結果、仮に同量の仮想メモリ資源を持つシステムの場合であっても、本機能の有効/無効によって、同時に起動できるJavaプロセスの数が異なる場合があります。
 Linuxで仮想メモリ資源の見積もりを行なう場合には、overcommit memory機能の有無に注意してください。

目次 索引 前ページ次ページ

Copyright 20078 FUJITSU LIMITED