2.4.1 ZGCの仕組み
ここでは,ZGCの仕組みについて説明します。
- 〈この項の構成〉
(2) ZGCの用語
「2.4.1 ZGCの仕組み」〜「2.4.2 ZGCのチューニング」で使用する用語を次の表に示します。
用語 |
説明 |
---|---|
ページ |
Javaヒープ領域のメモリ空間を分割するブロックです。ZGCでは,Javaヒープ領域のメモリ空間を3種類のページに分割して管理しています。 |
ページの回収 |
オブジェクトを含んだページをページごと削除し,メモリ空間を再利用できるようにすることです。 |
フォワーディングテーブル |
使用中のオブジェクトを再配置するときに,使用中のオブジェクトの古いアドレスから新しいアドレスへのマッピング情報を書き込むテーブルです。 |
(3) JavaVMで使用するメモリ空間の構成
アプリケーション実行中のZGCで管理するメモリ空間の構成を次の図に示します。
|
各ページのサイズについて説明します。
-
Smallページ
サイズは2メガバイトです。
-
Mediumページ
サイズは,Javaヒープの最大サイズの3.125%です。ただし,値は2の累乗の数値になるように切り捨てられます。また,値の範囲は2メガバイト〜32メガバイトです。なお,Javaヒープの最大サイズは-Xmxオプションで設定できます。-Xmxオプションの詳細は,「5.4 日立JavaVMで指定できるJava HotSpot VMのオプション」を参照してください。
-
Largeページ
サイズは,Mediumページのサイズの12.5%より大きな値です。なお,サイズはページごとに異なります。
次に,各領域について説明します。
-
Free領域
ページが割り当てられていない領域を指します。この領域から,ページの新規作成に必要な領域を割り当てます。また,回収されたページの領域はFree領域に追加されます。
-
Metaspace領域
ロードされたクラスなどの情報が格納される領域を指します。
(4) ZGCサイクル
ZGCでは,ZGCサイクルと呼ばれる一連の処理を実行することでGC処理をします。
ZGCサイクルの概要を次の図に示します。
|
ZGCサイクルは,アプリケーションとGC処理を並行して実行するフェーズ(M/R,RP,EC,RE)と,アプリケーションを一時停止してGC処理を実行するフェーズ(STW1,STW2,STW3)で構成されます。
各フェーズで実行する処理の内容は,次のとおりです。
(a) STW1
M/Rフェーズでオブジェクトの参照をたどるときの起点となるオブジェクトをマークします。
(b) M/R(mark/remap)
通常の参照を処理します。Javaヒープ領域内のすべてのオブジェクトに対して,使用中か使用済みかを判別し,マーキングします。マーキングの結果を基に,ECフェーズで回収するページを選択します。また,前回のZGCサイクルで回収したページに含まれていた使用中のオブジェクトを,フォワーディングテーブルを経由せずに直接参照できるようマッピング処理をします。
(c) STW2
アプリケーションの実行を一時停止し,M/Rフェーズですべてのオブジェクトがマーキングされたかどうかを確認します。マーキングされていないオブジェクトがある場合は,再びM/Rフェーズを開始します。
(d) RP(reference processing)
M/Rフェーズでのマーキング結果を基に,弱参照,ソフト参照,およびファントム参照をたどって,オブジェクトが使用済みかどうかを判別します。
(e) EC(evacuation candidates)
M/RおよびRPフェーズでマーキングしたオブジェクトの情報を基に,回収するページを選択します。また,回収するページにある使用中のオブジェクトについて,現在のアドレスから新しいアドレスへのマッピング情報をフォワーディングテーブルに書き込みます。
(f) STW3
現在のサイクルが終了してから次のサイクルが開始するまでの間で,REフェーズで移動する使用中のオブジェクトを参照する場合に,フォワーディングテーブルを介して参照できるようマッピング処理をします。
(g) RE(relocation)
使用中のオブジェクトを,Free領域から割り当てたページにコピーします。そのあと,使用済みのオブジェクトをページごと回収します。これによって,使用済みのオブジェクトの削除が完了します。
(6) オブジェクト作成時
オブジェクトのサイズに応じて,Smallページ,MediumページまたはLargeページにオブジェクトが配置されます。
各ページに配置されるオブジェクトは次のとおりです。
-
SmallページおよびMediumページ
各ページのサイズの12.5%以下のオブジェクトが配置されます。
-
Largeページ
Mediumページのサイズの12.5%より大きなオブジェクトが配置されます。ただし,Largeページに配置できるオブジェクトは,1ページごとに1つだけです。
なお,すでにオブジェクトがあるページに新しいオブジェクトを配置できる場合は,そのページを優先してオブジェクトを配置します。
(7) 回収するページの選択
使用済みのオブジェクトの割合に応じて,回収するページを選択します。この割合は,-XX:ZFragmentationLimitオプションで設定できます。詳細は,「5.4 日立JavaVMで指定できるJava HotSpot VMのオプション」を参照してください。
(8) 使用中のオブジェクトのコピーとページの回収
選択したページに含まれる使用中のオブジェクトのサイズに応じて,Free領域からページを割り振り,使用中のオブジェクトをコピーします。そのあと,ページを回収して,削除します。Free領域が不足してコピーできない場合は,InPlaceを使用します。
InPlaceとは,回収するページ内に使用中のオブジェクトをコピーする方法です。これによって,Free領域が不足している場合でも,OutOfMemoryにならないでGC処理を実行できます。
InPlaceの概要を次の図に示します。
|
(9) GC完了
回収されたページの領域は,Free領域に追加されて再利用されます。
(10) ZGC独自のGC発生要因
GC発生要因のうち,ZGCを使用している場合にだけ適用される要因について説明します。
GC発生要因 |
説明 |
---|---|
ZTimer |
前回のGCから,-XX:ZCollectionInterval=<seconds>オプションで指定した時間が経過したため,GCが発生しました。 |
ZWarmup |
ZWarmup以外の要因のGCが発生していないときに,ヒープ領域の使用率が10%,20%または30%を超えたため,GCが発生しました。 |
ZAllocationRate |
最大割り当て率と空きメモリ量から,OutOfMemoryが発生するおそれがあると判断されたため,GCが発生しました。 |
ZAllocationStall |
アプリケーションの実行に必要なJavaヒープ領域の空き容量が不足しているため,GCが発生しました。 |
ZProactive |
GCでスループットが低下してもシステムの動作に大きな影響がない場合に,前もってGCが発生しました。 |
ZHighUsage |
Javaヒープ領域の95%以上が使用されたため,GCが発生しました。 |