Cosminexus システム設計ガイド

[目次][用語][索引][前へ][次へ]

8.4.1 DefNew::Survivor領域のメモリサイズの見積もり

DefNew::Survivor領域のメモリサイズは,実際にアプリケーションを動作させて,DefNew::Survivor領域の使用状況を確認しながらチューニングしていきます。

チューニングの流れを次に示します。

  1. アプリケーションでのリクエスト/レスポンス処理に使用するメモリサイズを見積もり,それをDefNew::Survivor領域のメモリサイズに指定して,アプリケーションを実行します。
    このとき,チューニングで使用する情報を出力するために,-XX:+PrintTenuringDistributionオプションを指定してJ2EEサーバを起動します。
  2. DefNew::Survivor領域に割り当てられているメモリサイズと,アプリケーション実行時に実際に使用されているメモリ使用量から,メモリ使用率を確認します。
    メモリ使用率が100%に近い場合,コピーガーベージコレクション実行時にDefNew領域およびDefNew::Survivor領域のFrom空間の使用中オブジェクトがTo空間に入り切らなくなり,オブジェクトの退避が発生します。この場合は,DefNew::Survivor領域を増やすことを検討してください。
  3. DefNew::Survivor領域のオブジェクトの年齢分布を確認し,寿命の長いオブジェクトが存在し続けていないかを確認します。
    DefNew::Survivor領域のメモリサイズを増やすと,オブジェクトがTenured領域に移動するのが遅くなります。寿命の長いオブジェクトをDefNew::Survivor領域に格納し続けるのは,性能を低下させる要因になります。この場合は,DefNew::Survivor領域のメモリサイズを小さくするか,またはTenured領域に移動するためのしきい値を下げることを検討してください。

それぞれのチューニング作業について説明します。

<この項の構成>
(1) リクエスト/レスポンス処理に使用するメモリサイズの見積もり
(2) メモリ使用率の確認
(3) オブジェクトの年齢分布の確認

(1) リクエスト/レスポンス処理に使用するメモリサイズの見積もり

DefNew::Survivor領域は,寿命の短いオブジェクトを格納する領域です。サーバサイドで動作するアプリケーションの場合,リクエストやレスポンスの処理するために使われている,寿命の短いオブジェクトを格納する領域と考えることができます。このため,DefNew::Survivor領域のメモリサイズの見積もりでは,ある時点で存在する寿命が短いオブジェクトの最大サイズ,つまり,ある時点でのリクエストやレスポンスの処理に使用するメモリの最大サイズを考えます。例えば,ステートレスなサーブレットで構成されたアプリケーションの場合,DefNew::Survivor領域のメモリサイズを,「一つのリクエスト処理で使用する最大メモリサイズ×リクエストの同時実行数」と考えることができます。

(2) メモリ使用率の確認

「(1) リクエスト/レスポンス処理に使用するメモリサイズの見積もり」で見積もった値をDefNew::Survivor領域のメモリサイズとして設定して,アプリケーションを実行します。実行時に使用されるメモリ使用量から,DefNew::Survivor領域に割り当てたメモリサイズに対するメモリ使用率を確認します。

参考
DefNew::Survivor領域のメモリサイズは,直接は指定できません。
DefNew::Survivor領域のメモリサイズを指定する場合は,まず,-XmxオプションでJavaヒープの最大サイズを指定して,-XX:NewRatio=<value>によってJavaヒープのメモリサイズをDefNew領域とTenured領域で分ける割合を指定した上で,-XX:SurvivorRatio=<value>オプションによって,DefNew::Eden領域との割合を指定する必要があります。
 

メモリ使用率は,拡張verbosegc情報で確認できます。

コピーガーベージコレクション実行時の拡張verbosegc情報の出力例を次に示します。


[VGC]<Wed May 11 23:12:05 2005>[GC 27340K->27340K(32704K), 0.0432900 secs][DefNew::Eden: 3440K->0K(3456K)][DefNew::Survivor: 58K->58K(64K)][Tenured: 23841K->27282K(29184K)][Perm: 1269K->1269K(4096K)][cause:ObjAllocFail][User: 0.0156250 secs][Sys: 0.0312500 secs]

「DefNew::Survivor: 58K->58K(64K)」は,「ガーベージコレクション実行前のメモリサイズ->ガーベージコレクション実行後のメモリサイズ(割り当てられているメモリサイズ)」を意味します。この場合,64KBのDefNew::Survivor領域中58KBがすでに使用されていて,使用率は約90%になります。

ポイント
DefNew::Survivor領域のメモリ使用率には,目標値があります。デフォルトでは50%ですが,-XX:TargetSurvivorRatio=<value>で変更できます。この目標値は,DefNew::Survivor領域のオブジェクトがTenured領域に移動するときのしきい値に影響します。使用率が目標値を超えた場合はしきい値が下がり,使用率が目標値を下回った場合はしきい値が上がります。使用率が目標値よりも高い場合は,DefNew::Survivor領域のメモリサイズを増やすことを検討してください。
 
参考
-XX:PrintTenuringDistributionオプションの出力結果からメモリ使用率を確認することもできます。その場合は,すべての年齢のオブジェクトが使用しているメモリサイズの合計値と,「(1) リクエスト/レスポンス処理に使用するメモリサイズの見積もり」で設定した値を比べてメモリ使用率を算出してください。-XX:PrintTenuringDistributionオプションの出力結果の例については,「(3) オブジェクトの年齢分布の確認」を確認してください。
 

(3) オブジェクトの年齢分布の確認

DefNew::Survivor領域のオブジェクトの年齢分布を確認し,寿命の長いオブジェクトが存在し続けていないかを確認します。オブジェクトの年齢分布は,-XX:+PrintTenuringDistributionオプションの出力結果で確認できます。

J2EEサーバ起動時にusrconf.cfgに-XX:PrintTenuringDistributionオプションを指定すると,DefNew::Survivor領域の使用状況が出力されます。出力例を次に示します。

 
Desired survivor size 5467547 bytes, new threshold 30 (max 31)
- age   1:    1357527 bytes,       1357527 total
- age   2:     182134 bytes,       1539661 total
 

「-age」に続けて出力されているのが,DefNew::Survivor領域でその年齢のオブジェクトが使用しているメモリサイズです。なお,「total」は,1歳からその年齢までのオブジェクトが使用しているメモリサイズの累計です。例の場合は,1歳のオブジェクトのメモリサイズが1,357,527バイト,2歳のオブジェクトのメモリサイズが182,134バイト,1歳と2歳のオブジェクトのメモリサイズの合計が1,539,661バイトであることを示しています。

DefNew::Survivor領域で寿命の長いオブジェクトの割合が高い場合は,DefNew::Survivor領域のメモリサイズを小さくするか,またはTenured領域に移動するためのしきい値を下げることを検討してください。