Cosminexus システム設計ガイド
DefNew::Survivor領域のメモリサイズは,実際にアプリケーションを動作させて,DefNew::Survivor領域の使用状況を確認しながらチューニングしていきます。
チューニングの流れを次に示します。
それぞれのチューニング作業について説明します。
DefNew::Survivor領域は,寿命の短いオブジェクトを格納する領域です。サーバサイドで動作するアプリケーションの場合,リクエストやレスポンスの処理するために使われている,寿命の短いオブジェクトを格納する領域と考えることができます。このため,DefNew::Survivor領域のメモリサイズの見積もりでは,ある時点で存在する寿命が短いオブジェクトの最大サイズ,つまり,ある時点でのリクエストやレスポンスの処理に使用するメモリの最大サイズを考えます。例えば,ステートレスなサーブレットで構成されたアプリケーションの場合,DefNew::Survivor領域のメモリサイズを,「一つのリクエスト処理で使用する最大メモリサイズ×リクエストの同時実行数」と考えることができます。
「(1) リクエスト/レスポンス処理に使用するメモリサイズの見積もり」で見積もった値をDefNew::Survivor領域のメモリサイズとして設定して,アプリケーションを実行します。実行時に使用されるメモリ使用量から,DefNew::Survivor領域に割り当てたメモリサイズに対するメモリ使用率を確認します。
メモリ使用率は,拡張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領域のオブジェクトの年齢分布を確認し,寿命の長いオブジェクトが存在し続けていないかを確認します。オブジェクトの年齢分布は,-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領域に移動するためのしきい値を下げることを検討してください。
All Rights Reserved. Copyright (C) 2006, 2008, Hitachi, Ltd.