3.1.2 SerialGCのメモリー構造とGCの流れについて
Javaのメモリー管理の方式にSerialGCを選択すると、メモリー領域の使用状況に応じて、CopyGCやFullGCが発生します。SerialGCを選択する場合、-XX:+UseSerialGCオプションのほか、メモリー領域に関するオプションを指定します。
SerialGCのメモリー構造
Javaのメモリー管理の方式にSerialGCを選択した場合の、メモリー構造を次の図に示します。
各領域の役割を次の表に示します。
項番 |
領域の名称 |
役割 |
---|---|---|
1 |
Javaヒープ領域 |
Javaプログラムが使用するメモリー領域です。大きくNew領域とTenured領域に分かれています。 |
2 |
New領域 |
新しいオブジェクトが格納される領域です。Eden領域とSurvivor領域に分かれています。 |
3 |
Eden領域 |
作成直後のオブジェクトが格納される領域です。 |
4 |
Survivor領域 |
New領域に格納されていたJavaオブジェクトのうち、CopyGC実行時に破棄されなかった使用中のオブジェクトが格納される領域です。From空間とTo空間に分かれています。 |
5 |
Tenured領域 |
長時間使用するオブジェクトが格納される領域です。 |
6 |
Metaspace領域 |
ロードされたクラス情報やメソッド情報が格納される領域です。 |
7 |
Cヒープ領域 |
Developer's Kit for Javaがネイティブライブラリーを実行する際に使用する領域です。OS固有領域です。 |
8 |
スレッドスタック領域 |
スレッドごとに保持するスタック領域です。OS固有領域です。 |
SerialGCの場合のGCの流れ
SerialGCの場合のGCの流れを示します。
-
1回目のCopyGC
生成されたオブジェクトは、 New領域のEden領域に格納されます。Eden領域にオブジェクトがいっぱいになると、1 回目のCopyGCが発生します。CopyGCはNew領域全体を対象としています。CopyGCが発生すると、使用済みのオブジェクトを削除し、使用中のオブジェクトをSurvivor領域のTo空間(S1)に移動します。
-
2回目のCopyGC
1 回目のCopyGC発生後、再びEden領域にオブジェクトがいっぱいになると、2 回目のCopyGCが発生します。CopyGCはNew領域全体を対象とするため、1 回目のCopyGCでEden領域からSurvivor領域のTo空間(S1)に移動したオブジェクトもCopyGCの対象となります。2 回目のCopyGC発生時にEden領域に格納されていた使用中のオブジェクトは、To空間(S2)に移動し、同じくFrom空間(S1)にある使用中のオブジェクトもTo空間(S2)に移動します。
-
n回目のCopyGC
Survivor領域に移動したオブジェクトは、CopyGC発生時に使用中の場合、Survivor領域内でFrom 空間とTo空間を交互に移動し続けます。あるオブジェクトについてCopyGCの発生回数が一定の回数を超えると(図の場合15回)、そのオブジェクトはSurvivor領域からTenured領域に移動します。
-
FullGC
Tenured領域がオブジェクトでいっぱいになるとFullGCが発生し、Javaヒープ領域全体を対象に使用済みオブジェクトを削除します。
SerialGCの場合に設定するパラメーター
SerialGCの場合、長時間アプリケーションを停止するFullGCが必ず発生するため、FullGCを発生できるタイミングまでFullGCが発生しないようにメモリーの設計・チューニングをする必要があります。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領域の割合を設定します。 |