ここでは,JavaVMで使用するメモリ空間の構成と,JavaVMオプションについて説明します。
JavaVMでは,JavaVM固有領域とOS固有領域という,2種類のメモリ空間を使用します。
日立のJavaVMで使用するメモリ空間の構成を次の図に示します。なお,図中の番号は,表7-1の項番と対応しています。
図7-7 JavaVMで使用するメモリ空間の構成
![[図データ]](figure/zu070700.gif)
それぞれの領域について説明します。なお,Eden領域,Survivor領域,およびTenured領域を合わせた領域を,Javaヒープといいます。
- Eden領域
- newによって作成されたJavaオブジェクトが最初に格納される領域です。
- Survivor領域
- New領域に格納されていたJavaオブジェクトのうち,コピーガーベージコレクション実行時に破棄されなかったJavaオブジェクトが格納される領域です。Survivor領域は,From空間とTo空間で構成されます。From空間とTo空間のサイズは同じです。
- Tenured領域
- 長期間必要であると判断されたJavaオブジェクトが格納される領域です。Survivor領域で指定回数を超えてコピーガーベージコレクションの実行対象となり,破棄されなかったJavaオブジェクトが,この領域に移動されます。
- Permanent領域
- ロードされたclassなどの情報が格納される領域です。
- Explicitヒープ領域
- フルガーベージコレクションの対象外になるJavaオブジェクトが格納される領域です。Explicitヒープ領域は日立のJavaVM独自のメモリ空間で,明示管理ヒープ機能を利用する場合だけ確保されます。
- Cヒープ領域
- JavaVM自身が使用する領域です。JNIで呼び出されたネイティブライブラリでも使用されます。
- スタック領域
- Javaスレッドのスタック領域です。
それぞれの領域のサイズや割合などを指定するJavaVMオプションを次の表に示します。なお,表の項番は,図7-7と対応しています。
表7-1 JavaVMメモリ空間のサイズや割合などを指定するJavaVMオプション
項番 | オプション名 | オプションの意味 |
---|
1 | -Xmx<size> | Javaヒープの最大サイズを設定します。 |
2 | -Xms<size> | Javaヒープの初期サイズを設定します。 |
3 | -XX:MaxPermSize=<size> | Permanent領域の最大サイズを設定します。 |
4 | -XX:PermSize=<size> | Permanent領域の初期サイズを設定します。 |
5 | -Xmn<size> | New領域の初期値および最大値を設定します。 |
6 | -XX:[+|-]HitachiAutoExplicitMemory | 自動配置機能を使用する場合に,JavaVMを起動したタイミングでExplicitメモリブロックで使用するメモリを確保します。※ |
7 | -XX:HitachiExplicitHeapMaxSize=<size> | Explicitヒープ領域サイズの最大サイズを設定します。※ |
8 | -Xss<size> | 1スタック領域の最大サイズを設定します。 |
9 | -XX:NewRatio=<value> | New領域に対するTenured領域の割合を設定します。 <value>が2の場合は,New領域とTenured領域の割合が,1:2になります。 |
10 | -XX:SurvivorRatio=<value> | Survivor領域のFrom空間とTo空間に対するEden領域の割合を設定します。 <value>に8を設定した場合は,Eden領域,From空間,To空間の割合が,8:1:1になります。 |
11 | -XX:TargetSurvivorRatio=<value> | ガーベージコレクション実行後のSurvivor領域内でJavaオブジェクトが占める割合の目標値を設定します。 |
12 | -XX:MaxTenuringThreshold=<value> | コピーガーベージコレクション実行時に,From空間とTo空間でJavaオブジェクトを入れ替える回数の最大値を設定します。 設定した回数を超えて入れ替え対象になったJavaオブジェクトは,Tenured領域に移動されます。 |
注 <size>の単位はバイトです。
注※ 明示管理ヒープ機能を使用するための前提オプションが有効になっている必要があります。詳細は「7.10 Explicitヒープのチューニング」を参照してください。
- 参考
- JavaVMオプションは,次の個所に設定します。
表7-2 JavaVMオプションを設定する個所
対象 | 設定方法 | 設定個所 |
---|
J2EEサーバ | Smart Composer機能 | - 定義ファイル
- 簡易構築定義ファイル
- 設定対象
- 論理J2EEサーバ(j2ee-server)
- パラメタ名
- add.jvm.arg
|
バッチサーバ | Smart Composer機能 | - 定義ファイル
- 簡易構築定義ファイル
- 設定対象
- 論理J2EEサーバ(j2ee-server)
- パラメタ名
- add.jvm.arg
|
SFOサーバ | Smart Composer機能 | - 定義ファイル
- 簡易構築定義ファイル
- 設定対象
- 論理SFOサーバ(sfo-server)
- パラメタ名
- add.jvm.arg
|
EJBクライアントアプリケーション | ファイル編集 | - 定義ファイル
- usrconf.cfg※
- パラメタ名
- add.jvm.argキー
|
Webコンテナサーバ | ファイル編集 | - 定義ファイル
- usrconf.cfg
- パラメタ名
- add.jvm.argキー
|
注※ cjclstartapコマンドを使用して開始する場合に有効になるファイルです。
- ポイント
- それぞれのオプションのデフォルト値は,OSによって異なります。オプションのデフォルト値については,マニュアル「Cosminexus アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「19.4 Cosminexusで指定できるJava HotSpot VMのオプションのデフォルト値」を参照してください。
- 注意
- Javaヒープ領域,Permanent領域,Cヒープ領域のどれかが不足するとOutOfMemoryが発生し,メモリ不足が解消されないかぎり正常に稼働できない状態が長く続くことになります。
- これに対して,OutOfMemory発生時のシステムへの影響を小さくするために,次のオプションを使用できます。
- -XX:+HitachiOutOfMemoryAbort(OutOfMemory発生時強制終了機能)
- -XX:+HitachiOutOfMemoryHandling(OutOfMemoryハンドリング機能)
- OutOfMemory発生時強制終了機能は,Javaヒープ不足やPermヒープ不足などが原因でOutOfMemoryが発生した場合に,J2EEサーバを強制終了するための機能です。Javaヒープ領域,Permanent領域,Cヒープ領域のメモリ不足によってOutOfMemoryが発生したときに,J2EEサーバを強制終了して,J2EEサーバを自動再起動します。これによって,J2EEサーバを正常に稼働できる状態に早期に回復できます。
- OutOfMemoryハンドリング機能は,OutOfMemory発生時強制終了機能を前提とする機能です。OutOfMemory発生時強制終了機能を使用している場合でも,特定の条件に合致するときに限ってJ2EEサーバの実行を継続したい場合に使用します。
- リクエスト処理でオブジェクトを大量に確保しようとした場合,巨大なオブジェクトを確保しようとした場合などにJavaヒープ不足が原因のOutOfMemoryが発生したときに,J2EEサーバの実行を継続するようにしたいときには,OutOfMemoryハンドリング機能を使用してください。
- オプションの詳細については,マニュアル「Cosminexus アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「-XX:[+|-]HitachiOutOfMemoryAbort(強制終了オプション)」および「-XX:[+|-]HitachiOutOfMemoryHandling(OutOfMemoryハンドリングオプション)」を参照してください。