Hitachi

 Hitachi Application Server V10 ユーザーズガイドWindows®用)


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ヒープ領域の最大サイズを設定します。