7.15.8 YoungGC
(1) 実行契機
-
YoungGC(normal)
Eden領域にオブジェクトを確保できなかった場合に発生します。また,サイズの大きなオブジェクトをHumongous領域に確保できなかった場合にも発生します。
-
YoungGC(initial-mark)
直前に実行されたYoungGC(normal)終了時に,Tenured領域の使用サイズがJavaヒープ領域の45%を超えていた場合,1.の実行契機を満たすとYoungGC(initial-mark)が実行されます。また,サイズの大きなオブジェクトを確保時,Tenured領域の使用サイズとオブジェクトの確保サイズの合計サイズがJavaヒープ領域の45%を超えた場合,YoungGC(initial-mark)が実行されます。
(2) 対象範囲
New領域
(3) 処理内容
-
YoungGCが発生するとシングルスレッドでリージョンの選択処理をし,その後マルチスレッドでEvacuationをします。
-
YoungGCのEvacuationではEden領域とFrom空間内の使用中のオブジェクトをTo空間またはTenured領域に移動し,Eden領域とFrom空間を回収します。移動や回収の仕組みはCopyGCの仕組みと同じです。CopyGCの詳細については,「7.2.3 CopyGCの仕組み」を参照してください。
-
YoungGCでは,これまでに発生したGCのGC停止時間の統計から予測をし,次回のGCの予測停止時間が目標停止時間内に収まるようにNew領域のサイズを変更します。
-
New領域は最小サイズと最大サイズが存在し,その範囲内でリサイズをします。New領域は全GCで対象となるため,GC停止時間はNew領域が最小サイズの場合にかかるGC停止時間より短くすることはできません。
-
CMが終了後のYoungGCでは,予測回収サイズがJavaヒープ領域の10%を超えていた場合,次回のGCをMixedGCにするか判定します。次回のGCにMixedGCが選択された場合,Tenuredリージョンを多く対象とするように予測してNew領域のサイズを変更します。
-
YoungGC(initial-mark)のEvacuationではEvacuation中にローカル変数や使用中のオブジェクトから直接参照されているオブジェクトにマーク付けをします。このマーキングの結果は,Concurrent Markingに利用されます。Concurrent Markingの処理の詳細については,「7.15.9 Concurrent Marking(CM)」を参照してください。
(4) 処理結果
Eden領域:オブジェクトが回収され,空になります。GC後リサイズされます。
Survivor領域:From空間のオブジェクトが回収され,空になります。GC後リサイズされます。
Tenured領域:長期間必要と判断されたオブジェクトがTenured領域に移動します。
Humongous領域:変化はありません。
Metaspace領域:変化はありません。
Free領域:GC後のリサイズによって,増減します。
(5) アプリケーションの停止の有無
停止します。
(6) ほかのGCとの関係
CM:YoungGC中に実行されません。
MixedGC:YoungGC中に実行されません。
FullGC:YoungGC中に実行要件を満たすと,YoungGCを中止して実行されます。
(7) 補足
-
関連オプション
Evacuationをするスレッド数は-XX:ParallelGCThreadsオプションで変更することができます。スレッド数を増やすとYoungGCにかかる時間が小さくなります。また,オプションを指定しない場合,スレッド数は-XX:ParallelGCThreadsオプションのデフォルト値が用いられます。-XX:ParallelGCThreadsオプションについては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「14.5 Application Serverで指定できるJava HotSpot VMのオプション」の-XX:ParallelGCThreadsを参照してください。
-
確認方法
YoungGCの確認はログ上のGCの種別が“YoungGC”または“YoungGC(initial-mark)”であることから確認できます。また,New領域のリサイズはEden領域のサイズ変化とSurvivor領域のサイズ変化から確認できます。
[VG1]<Wed Jun 12 11:21:10 2013>[Young GC 899070K/899072K(1048576K)->501755K/501760K(1048576K), 0.0931560 secs][Status:-][G1GC::Eden: 389120K(389120K)->0K(397312K)][G1GC::Survivor: 41984K->41984K][G1GC::Tenured: 459776K->459776K][G1GC::Humongous: 2048K->2048K][G1GC::Free: 609536K->607232K][Metaspace: 3634K(4492K, 4492K)->3634K(4492K, 4492K)][class space: 356K(388K, 388K)->356K(388K, 388K)][cause:G1EvacuationPause][RegionSize: 1024K][Target: 0.2000000 secs][Predicted: 0.2495800 secs][TargetTenured: 0K][Reclaimable: 0K(0.00%)][User: 0.0156250 secs][Sys: 0.0312500 secs][IM: 729K, 928K, 0K][TC: 509][DOE: 16K, 171][CCI: 2301K, 49152K, 2304K]
上記のログの場合GC前のNew領域のサイズは389120K+41984K=431104Kであり,GC後のNew領域のサイズは397312K+41984K=439296Kであるため,New領域が拡張されたことが分かります。ログの記述内容や詳細に関しては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「-XX:[+|-]HitachiVerboseGC(拡張verbosegc情報出力オプション)」を参照してください。