3.1.4 G1GCのメモリー構造とGCの流れについて
Javaのメモリー管理の方式にG1GCを選択すると、メモリー領域に対してYoungGC、MixedGC、およびFullGCの3種類のGCが発生します。このうち、YoungGCとMixedGCについては、GC発生時にアプリケーションが停止する時間を制御できます。G1GCを選択する場合、-XX:+UseG1GCオプションのほか、GC発生時の目標の停止時間、メモリーに関するオプションや処理性能のチューニングに関するオプションを指定します。
G1GCのメモリー構造
Javaのメモリー管理の方式にG1GCを選択した場合の、メモリー構造を次の図に示します。
各領域の役割を次の表に示します。
項番 |
領域の名称 |
役割 |
---|---|---|
1 |
Javaヒープ領域 |
Javaプログラムが使用するメモリー領域です。大きくNew領域とTenured領域に分かれています。 |
2 |
New領域 |
新しいオブジェクトを格納する領域です。Eden領域とSurvivor領域に分かれています。 |
3 |
Eden領域 |
作成直後のオブジェクトを格納する領域です。 |
4 |
Survivor領域 |
1回以上GCを実施した、使用中のオブジェクトを格納する領域です。 |
5 |
Tenured領域 |
長時間使用するオブジェクトを格納する領域です。 |
6 |
Metaspace領域 |
ロードされたクラス情報やメソッド情報を格納する領域です。 |
7 |
Cヒープ領域 |
Developer's Kit for Javaがネイティブライブラリーを実行する際に使用する領域です。 |
8 |
スレッドスタック領域 |
スレッドごとに保持するスタック領域です。 |
9 |
New領域の未割り当ての領域 |
New領域内で、Eden領域またはSurvivor領域に割り当てていない領域です。 |
10 |
Humongous領域 |
サイズの大きいオブジェクトを格納する領域です。Tenured領域の一部で、連続したリージョンを割り当てます。 |
11 |
未割り当ての領域 |
Javaヒープ領域内で、どの領域にも割り当てていない領域です。 |
G1GCの場合のGCの流れ
G1GCでは、Java ヒープをリージョンというメモリーブロック単位で管理しているため、New領域やTenured領域を連続領域として確保していません。オブジェクトはリージョン内に格納し、リージョンに空きがない場合は、未割り当てのリージョンを領域に割り当て、オブジェクトを格納します。
メモリー管理方式にG1GCを選択した場合のGCの流れを次の図で説明します。
-
YoungGC
New 領域に割り当てたリージョンに空きがなくなると、YoungGC が発生します。YoungGCが発生すると、使用中のオブジェクトは Survivor 領域に割り当てたリージョンに移動し、使用済みのオブジェクトはリージョンごと解放します。また、YoungGC発生時に使用中のオブジェクトは、Survivor 領域に割り当てたリージョン間を移動し続け、ある一定の回数移動するとTenured領域に割り当てたリージョンに移動します。YoungGC発生後は、GC に掛かった時間から、次の GC に掛かる時間を予測して、New 領域のサイズを変更します。YoungGC発生後の図は、予測した時間より長くGCに時間が掛かったために、New領域を縮小した場合の例です。
-
MixedGC
Tenured 領域の使用率が増加すると、MixedGCが発生します。MixedGCが発生すると、New領域に割り当てたリージョンに加えて、目標停止時間内に収まる範囲で、一部のTenured領域に割り当てたリージョンがGCの対象となります。この一部のTenured領域に割り当てたリージョンは、アプリケーションの実行と並行して行っているオブジェクトが使用中かどうかの解析情報に基づいて、解放されるサイズが大きいと予測されるリージョンから優先してGCの対象となります。そのため、オブジェクトの情報解析が十分に実施されていない場合や、解析の結果MixedGC の効果が低い場合は、 MixedGCは発生しません。
-
FullGC
Java ヒープ内のリージョンに空きがなくなり、MixedGCが発生しない場合、Javaヒープ全体を対象としてFullGCが発生します。
G1GCの場合に設定するパラメーター
メモリー管理方式にG1GCを選択した場合、GC によるアプリケーションの停止時間とスループットがシステム要件を満たすように、メモリーの設計やチューニングをする必要があります。なお、G1GC はFullGCの発生によるアプリケーションの停止時間を制御できません。そのため、FullGCが発生している場合、FullGCが発生しないようにチューニングをする必要があります。G1GCの場合に設定するパラメーターを示します。
項番 |
項目 |
オプション名 |
説明 |
---|---|---|---|
1 |
G1GCの設定 |
-XX:+UseG1GC |
メモリー管理方式にG1GCを選択します。 |
2 |
-XX:MaxGCPauseMillis=目標停止時間 |
目標停止時間をミリ秒単位で設定します。 |
|
3 |
メモリーの設計 |
-XmxJavaヒープ領域の最大サイズ |
Javaヒープ領域の最大サイズを設定します。 |
4 |
-XmsJavaヒープ領域の初期サイズ |
Javaヒープ領域の初期サイズを設定します。このパラメーターは、-Xmxオプションと同じ値の設定を推奨します。 |
|
5 |
-XX:MaxMetaspaceSize=Metaspace領域の最大サイズ |
Metaspace領域の最大サイズを設定します。 |
|
6 |
-XX:MetaspaceSize=Metaspace領域に起因するFullGC の基準値 |
Metaspace領域に起因するFullGCの基準値を設定します。Metaspace領域のサイズが基準値を超えるとFullGCが発生するため、アプリケーションで必要なクラス情報のサイズから見積もった値を設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。 |
|
7 |
-XX:CompressedClassSpaceSize=Compressed Class Spaceの最大サイズ |
圧縮オブジェクトポインター機能が有効な場合にMetaspace領域内に作成されるCompressed Class Space領域の最大サイズを設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。 |
|
8 |
-XX:SurvivorRatio=New領域に対するSurvivor領域が最大の場合の割合 |
New領域に対するSurvivor領域が最大サイズの場合の割合を設定します。 |
|
9 |
処理性能のチューニング |
-XX:ParallelGCThreads=YoungGCおよびMixedGCを行うスレッド数 |
YoungGCおよびMixedGCを行うスレッド数を設定します。 ConcGCThreadsのスレッド数に合わせて設定します。 |
10 |
-XX:ConcGCThreads=アプリケーションと並行して処理を実行するスレッド数 |
アプリケーションと並行して処理を実行するスレッド数を設定します。 |