3.1.3 SerialGCと明示管理ヒープ機能を組み合わせた場合のメモリー構造とGCの流れについて
Javaのメモリー管理の方式に、SerialGCと明示管理ヒープ機能を組み合わせた方式を選択すると、SerialGCで発生するFullGCを明示管理ヒープ機能で抑止できます。SerialGCと明示管理ヒープ機能を組み合わせた方式を選択する場合、-XX:+UseSerialGCオプションのほか、メモリーに関するオプション、明示管理ヒープ機能の設定やExplicitヒープ領域のメモリー設計に関するオプションを指定します。
SerialGCと明示管理ヒープ機能を組み合わせた場合のメモリー構造
Javaのメモリー管理の方式にSerialGCと明示管理ヒープ機能を組み合わせた場合の、メモリー構造を次の図に示します。
各領域の役割を次の表に示します。
項番 |
領域の名称 |
役割 |
---|---|---|
1 |
Javaヒープ領域 |
Javaプログラムが使用するメモリー領域です。大きくNew領域とTenured領域に分かれています。 |
2 |
New領域 |
新しいオブジェクトを格納する領域です。Eden領域とSurvivor領域に分かれています。 |
3 |
Eden領域 |
作成直後のオブジェクトを格納する領域です。 |
4 |
Survivor領域 |
1回以上GCを実施した、使用中のオブジェクトを格納する領域です。 |
5 |
Tenured領域 |
長時間使用するオブジェクトを格納する領域です。 |
7 |
Explicitヒープ領域 |
セッションオブジェクトなどを格納する領域です。 |
6 |
Metaspace領域 |
ロードされたクラス情報やメソッド情報を格納する領域です。 |
8 |
Cヒープ領域 |
Developer's Kit for Javaがネイティブライブラリーを実行する際に使用する領域です。 |
9 |
スレッドスタック領域 |
スレッドごとに保持するスタック領域です。 |
SerialGCと明示管理ヒープ機能を組み合わせた場合のメモリー管理の仕組み
メモリー管理方式にSerialGCを選択し、Javaヒープ領域を使用していくとFullGCが発生することがあります。FullGCの発生を抑えるためには、明示管理ヒープ機能を使用して、Javaヒープ領域とは別のExplicitヒープ領域に、FullGCの要因となるオブジェクトを格納します。FullGCの対象となるTenured領域に、FullGCの要因となるオブジェクトが格納されないため、FullGCの発生を抑止できます。なお、Explicitヒープ領域に格納されたオブジェクトは、寿命が切れたタイミングで明示的に解放されます。
- FullGCの要因となるオブジェクト
-
長寿命オブジェクトで、かつ、一定期間が経過したあと不要になるオブジェクトが、FullGCの要因となります。このようなオブジェクトには、例えば、ログインからログアウトまでの一連の処理で使用するセッション情報に関係するオブジェクトが該当します。セッション情報は複数のリクエストにわたって使用するため、長寿命で、一定期間が経過してログアウトすると不要になります。Application Serverでは、セッション情報に関係するオブジェクトは、Explicitヒープ領域に格納するオブジェクトとしてデフォルトで設定されています。
- オブジェクトが不要になったときのメモリーの状態
-
寿命がわかっているオブジェクトが、一定期間が経過したあと不要になったときのメモリーの状態を次の図に示します。なお、明示管理ヒープ機能を使用した場合のExplicitヒープ領域は、Explicitメモリーブロックという、複数のメモリーブロックで構成されています。このExplicitメモリーブロック単位で、Explicit領域内のメモリーの初期化や解放が行われます。
- 明示管理ヒープ機能を使用した場合
-
Explicitヒープ内の寿命がわかっているオブジェクト群Aが、一定期間が経過したあと不要になると、オブジェクト群Aが格納されているExplicitメモリーブロックがブロックごと削除されます。
- 明示管理ヒープ機能を使用しない場合
-
Tenured領域内の寿命がわかっているオブジェクト群Aが、一定期間が経過したあと不要になると、FullGC が発生するまでTenured領域に残ります。
SerialGCと明示管理ヒープ機能を組み合わせた場合に設定するパラメーター
メモリー管理方式にSerialGCと明示管理ヒープ機能を組み合わせた方式を選択する場合、Javaヒープ領域とExplicitヒープ領域のメモリーの設計およびチューニングをする必要があります。SerialGCと明示管理ヒープ機能を組み合わせた場合に設定するパラメーターを示します。
項番 |
項目 |
オプション名 |
説明 |
---|---|---|---|
1 |
SerialGCの設定 |
-XX:+UseSerialGC |
メモリー管理方式にSerialGCを選択します。このパラメーターは、デフォルトで有効です。 |
2 |
メモリーの設計 |
-XmxJavaヒープ領域の最大サイズ |
Javaヒープ領域の最大サイズを設定します。 |
3 |
-XmsJavaヒープ領域の初期サイズ |
Javaヒープ領域の初期サイズを設定します。このパラメーターは、-Xmxオプションと同じ値の設定を推奨します。 |
|
4 |
-XX:MaxMetaspaceSize=Metaspace領域の最大サイズ |
Metaspace領域の最大サイズを設定します。 |
|
5 |
-XX:MetaspaceSize=Metaspace領域に起因するFullGC の基準値 |
Metaspace領域に起因するFullGCの基準値を設定します。Metaspace領域のサイズが基準値を超えるとFullGCが発生するため、アプリケーションで必要なクラス情報のサイズから見積もった値を設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。 |
|
6 |
-XX:CompressedClassSpaceSize=Compressed Class Spaceの最大サイズ |
圧縮オブジェクトポインター機能が有効な場合にMetaspace領域内に作成されるCompressed Class Space領域の最大サイズを設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。 |
|
7 |
-XX:NewRatio=New領域に対するTenured領域の割合 |
New領域を1とした場合のTenured領域の割合を設定します。 |
|
8 |
-XX:SurvivorRatio=Survivor領域のFrom空間とTo空間に対するEden領域の割合 |
Survivor領域のFrom空間とTo空間を1とした場合の、Eden領域の割合を設定します。 |
|
9 |
明示管理ヒープ機能の設定 |
-XX:+HitachiUseExplicitMemory |
明示管理ヒープ機能を有効にします。このパラメーターは、デフォルトで有効です。 |
10 |
Explicitヒープ領域のメモリー設計 |
-XX:HitachiExplicitHeapMaxSize=Explicitヒープ領域の最大サイズ |
Explicitヒープ領域の最大サイズを設定します。 |