Cosminexus V9 アプリケーションサーバ 機能解説 拡張編
![[目次]](FIGURE/CONTENT.GIF)
![[用語]](FIGURE/GLOSS.GIF)
![[索引]](FIGURE/INDEX.GIF)
![[前へ]](FIGURE/FRONT.GIF)
Javaヒープの初期サイズ(-Xms)と最大サイズ(-Xmx)には,必ず同じ値を指定してください。同じ設定でない場合,CopyGCの回数が増加するおそれがあります。
なお,この設定は,明示管理ヒープ機能を使用しない場合にも推奨の設定です。
- 補足:
- Javaヒープの初期サイズと最大サイズが異なる場合,各領域のサイズは,次のタイミングで変更されます。
- CopyGC終了時
New領域のサイズが動的に変更されます。
- FullGC終了時
Tenured領域とNew領域のサイズが動的に変更されます。
- New領域のサイズは,主にTenured領域のサイズと-XX:NewRatioオプションに指定した値によって決まります。
- 明示管理ヒープ機能によってFullGCの発生が抑止されると,Tenured領域のサイズが変更されるタイミングがなくなります。これに伴って,New領域のサイズも,ほぼ一定になります。
- このため,初期サイズよりも大きい最大サイズを定義していても,New領域が拡張されるタイミングがなくなり,初期サイズで指定したままのサイズになります。初期サイズで指定したNew領域が小さい場合,明示管理ヒープ機能を使用しない場合に比べて,CopyGCが多く発生するおそれがあります。
- HTTPセッション生成以降,setAttributeメソッドで設定したすべてのセッション属性(オブジェクト)は,HTTPセッションを破棄するまで解放されないで,Explicitヒープに残存します。その時点でHTTPセッションに設定されているかどうかは関係ありません。このため,HTTPセッションを破棄しないでsetAttributeメソッドを繰り返し実行した場合,Explicitヒープあふれが発生して,FullGC抑止の効果が得られないおそれがあります。Explicitヒープあふれが発生しているかどうかを確認するには,マニュアル「アプリケーションサーバ システム設計ガイド」の「7.14.3 Explicitヒープあふれが発生した場合の確認と対処」を参照してください。
- 自動解放機能を利用しない場合(-XX:-HitachiExplicitMemoryAutoReclaimの場合)で,HTTPセッションを削除する時に,そのセッションに格納したオブジェクトへの外部からの参照が残っているオブジェクトは,ExplicitヒープからJavaヒープのTenured領域に移動します。この場合,Tenured領域の使用済みサイズが増加することになり,FullGCの発生を抑止できません。
ExplicitヒープからJavaヒープへのオブジェクトの移動を防ぐためには,HTTPセッションを破棄する前に,セッションに格納したオブジェクトへの参照を削除する必要があります。
次のAPIを使用して取得したオブジェクトへの参照が残っている場合も同様です。
- getAttribute(String)
- getAttributeNames()
なお,自動解放機能を利用する場合(-XX:+HitachiExplicitMemoryAutoReclaimの場合)は,それらのオブジェクトがJavaヒープのTenured領域に移動することはありません。
- 次の場合,オブジェクトはExplicitヒープではなくJavaヒープに配置されます。
- Explicitメモリブロックの数が最大値になっており,新たにExplicitメモリブロックを作成できない場合(同時に存在するExplicitメモリブロックが1,048,575個になっている場合)に,新しいセッションを生成した場合
- Explicitヒープ領域の最大サイズを超えた場合
- Explicitメモリブロックを確保できなかった場合
これらに該当する場合,オブジェクトはJavaヒープに作成されるため,FullGCの発生抑止ができないおそれがあります。
- JSPでは,デフォルトで暗黙的にHttpSessionオブジェクトが作成されます。不要なHttpSessionオブジェクトの生成によるExplicitヒープあふれを防ぐため,セッションを必要としないJSPでは,明示的にHttpSessionオブジェクトを作成しない設定にしてください。設定には,pageディレクティブのsession属性を使用します。
- FullGC抑止の効果を検証するテストを実行する場合,セッションを破棄しないままで連続してセッションを生成し続けるような条件では実行しないでください。Explicitメモリブロックが解放されないため,Explicitヒープがあふれる可能性が高くなります。
また,Explicitメモリブロックは,セッションが破棄されたときに解放予約され,その後,GCが発生したときに解放されます。このため,セッションを破棄していても,セッションの破棄と生成の繰り返し回数が1回のGC間隔に対して多過ぎる場合には,解放予約されたExplicitメモリブロックが残存したままの状態で別のExplicitメモリブロックが作成されてしまいます。その結果,Explicitメモリブロックの個数が増加し,Explicitヒープがあふれるおそれがあります。
FullGC抑止の効果を検証するには,セッションを適切に管理する条件でテストを実行してください。
- セッションに格納したオブジェクトは,生成直後はJavaヒープに配置されます。何度かCopyGCが実行されたあと,通常はTenured領域に昇格するタイミングでExplicitヒープに移動します。このため,短時間で削除される場合や,セッションがすぐに破棄される場合は,オブジェクトはExplicitヒープには配置されません。
(3) スレッドダンプへ出力するExplicitメモリブロック名称の文字数の上限
JavaVMのスレッドダンプに出力するExplicitヒープ詳細情報には,Explicitメモリブロックの名称が出力されます。Explicitメモリブロックの名称の文字数の上限は2,000文字です。JP.co.Hitachi.soft.jvm.MemoryAreaクラスのsetNameメソッドで,2,000文字を超えるExplicitメモリブロックの名称を設定した場合,2,000文字を超えた部分の名称は,スレッドダンプに出力されません。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.