7.15.7 G1GCで実行されるGC
G1GCの世代別GCで実行されるGCには,次の3種類があります。
-
YoungGC
New領域を対象とするGCです。YoungGCにはYoungGC(normal)とYoungGC中にマーキングをするYoungGC(initial-mark)があります。詳細については,「7.15.8 YoungGC」を参照してください。なお,単にYoungGCと表記した場合,YoungGC(normal)とYoungGC(initial-mark)の両方に当てはまる事項となります。また,YoungGC(normal)とYoungGC(initial-mark)を区別して表す場合は,“(normal)”と“(initial-mark)”を明記します。ただし,ログファイルのGC種別にはYoungGC(normal)はYoungGCという種別で出力します。YoungGCはJavaオブジェクトの作成によって,Eden領域を使い切ると発生します。
-
MixedGC
New領域とTenured領域を対象とするGCです。Tenuredリージョンは目標停止時間に併せて部分的な範囲を対象とします。詳細については,「7.15.10 MixedGC」を参照してください。MixedGCはYoungGC同様,Javaオブジェクトの作成によって,Eden領域を使い切ると発生しますが,Concurrent Markingと呼ばれるオブジェクトが使用中かどうかの解析処理の結果に基づいて発生します。詳細については,「7.15.9 Concurrent Marking(CM)」を参照してください。そのため,解析が十分にされていない場合や解析の結果MixedGCの効果が低いと予測される場合は,YoungGC(normal)が発生します。
-
FullGC
Tenured領域やMetaspace領域,Humondous領域を含む,JavaVM固有領域全体を対象にしたGCです。詳細については,「7.15.11 FullGC」を参照してください。Tenured領域やMetaspace領域,Humongous領域を確保できなかった場合に発生します。
それぞれのGCが対象とする領域をまとめると次の図となります。
また,各GCの状態遷移図を次の図に示します。
-
YoungGC(normal)実行後,CMが実行されておらず,Tenured領域の使用率がJavaヒープ領域の45%を超えた場合は,次のGCではYoungGC(initial-mark)を実行する状態に遷移します。
-
YoungGC(normal)実行後,CMが実行されておらず,Tenured領域の使用率がJavaヒープ領域の45%以下の場合は,次のGCもYoungGC(normal)を実行する状態のままです。
-
YoungGC(initial-mark)実行後,次のGCではYoungGC(normal)とCMを並行して実行する状態に遷移します。
-
CMが実行中の場合は,YoungGC(normal)を実行する状態のままです。
-
CM終了直後のYoungGC(normal)で予測回収率が10%を超えている場合,次のGCではMixedGCを実行する状態に遷移します。
-
予測回収率が10%以下の場合,次のGCもYoungGC(normal)を実行する状態のままです。
-
MixedGC実行後,予測回収率が10%を超えている場合,次のGCではMixedGCを実行する状態のままです。
-
MixedGC実行後,予測回収率が10%以下の場合,次のGCではYoungGC(normal)を実行する状態に遷移します。
ただし,次の場合GCの状態によらず条件を満たすと対応するGCを実行します。
-
YoungGCまたは,MixedGCを実行しても空き領域を確保できなかった場合,FullGCを実行します。FullGC実行後はYoungGC(normal)を実行する状態に遷移します。
-
サイズの大きなオブジェクトを確保時,CMが実行されておらず,Tenured領域の使用サイズと確保するオブジェクトのサイズの合計がJavaヒープ領域の45%を超えた場合,YoungGC(initial-mark)を実行します。
次に,G1GCの処理の流れについて,Javaオブジェクトを例にして説明します。
-
YoungGC
上図のようにNew領域に割り当てたリージョンに空きがなくなるとYoungGCが発生します。YoungGCでは使用中のオブジェクトはSurvivor領域に割り当てたリージョンに移動し,使用済みのオブジェクトはリージョンごと解放します。また,SerialGCのCopyGCと同様,YoungGC発生時に使用中のオブジェクトはSurvivor領域に割り当てたリージョン間を移動し続け,ある一定の回数を移動するとTenured領域に割り当てたリージョンに移動します。YoungGC後上図のようにGCにかかった時間から,次のGCにかかる時間を予測し,New領域のサイズを変更します。上図の場合は,予測した時間よりGCにかかる時間が長いため,New領域を縮小した場合の例です。
-
MixedGC
Tenured領域の使用率が増加すると,MixedGCが発生します。MixedGCではNew領域に割り当てたリージョンに加えて,目標停止時間内に収まる範囲で,一部のTenured領域に割り当てたリージョンをGCの対象とします。この一部のTenured領域に割り当てたリージョンは,アプリケーションと並行して実行しているオブジェクトが使用中かどうかの解析情報に基づき,解放されるサイズが大きいと予測されるリージョンから優先してGCの対象となります。そのため,オブジェクトの情報解析が十分にされていない場合や解析の結果MixedGCの効果が低い場合は,MixedGCは発生しません。
-
FullGC
Javaヒープ内のリージョンに空きがなくなり,MixedGCが発生しない場合,Javaヒープ全体を対象としてFullGCが発生します。