Hitachi

uCosminexus Application Runtime - Cosminexus Developer's Kit for Java 機能解説・リファレンス


2.4.1 ZGCの仕組み

ここでは,ZGCの仕組みについて説明します。

〈この項の構成〉

(1) ZGCの概要

ZGCは,チューニングが簡単で,かつ停止時間が短いスケーラブルなGCです。そのため,低レイテンシが要求されるシステム,および大規模なメモリ環境のシステムに適しています。

(2) ZGCの用語

2.4.1 ZGCの仕組み」〜「2.4.2 ZGCのチューニング」で使用する用語を次の表に示します。

表2‒6 ZGCの用語

用語

説明

ページ

Javaヒープ領域のメモリ空間を分割するブロックです。ZGCでは,Javaヒープ領域のメモリ空間を3種類のページに分割して管理しています。

ページの回収

オブジェクトを含んだページをページごと削除し,メモリ空間を再利用できるようにすることです。

フォワーディングテーブル

使用中のオブジェクトを再配置するときに,使用中のオブジェクトの古いアドレスから新しいアドレスへのマッピング情報を書き込むテーブルです。

(3) JavaVMで使用するメモリ空間の構成

アプリケーション実行中のZGCで管理するメモリ空間の構成を次の図に示します。

図2‒38 アプリケーション実行中のZGCで管理するメモリ空間の構成

[図データ]

各ページのサイズについて説明します。

次に,各領域について説明します。

(4) ZGCサイクル

ZGCでは,ZGCサイクルと呼ばれる一連の処理を実行することでGC処理をします。

ZGCサイクルの概要を次の図に示します。

図2‒39 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領域から割り当てたページにコピーします。そのあと,使用済みのオブジェクトをページごと回収します。これによって,使用済みのオブジェクトの削除が完了します。

(5) Javaヒープ領域のメモリ管理方法

オブジェクト作成からGC完了までの流れを次の図に示します。

図2‒40 オブジェクト作成からGC完了までの流れ

[図データ]

(6) オブジェクト作成時

オブジェクトのサイズに応じて,Smallページ,MediumページまたはLargeページにオブジェクトが配置されます。

各ページに配置されるオブジェクトは次のとおりです。

なお,すでにオブジェクトがあるページに新しいオブジェクトを配置できる場合は,そのページを優先してオブジェクトを配置します。

(7) 回収するページの選択

使用済みのオブジェクトの割合に応じて,回収するページを選択します。この割合は,-XX:ZFragmentationLimitオプションで設定できます。詳細は,「5.4 日立JavaVMで指定できるJava HotSpot VMのオプション」を参照してください。

(8) 使用中のオブジェクトのコピーとページの回収

選択したページに含まれる使用中のオブジェクトのサイズに応じて,Free領域からページを割り振り,使用中のオブジェクトをコピーします。そのあと,ページを回収して,削除します。Free領域が不足してコピーできない場合は,InPlaceを使用します。

InPlaceとは,回収するページ内に使用中のオブジェクトをコピーする方法です。これによって,Free領域が不足している場合でも,OutOfMemoryにならないでGC処理を実行できます。

InPlaceの概要を次の図に示します。

図2‒41 InPlaceの概要

[図データ]

(9) GC完了

回収されたページの領域は,Free領域に追加されて再利用されます。

(10) ZGC独自のGC発生要因

GC発生要因のうち,ZGCを使用している場合にだけ適用される要因について説明します。

表2‒7 ZGC独自のGC発生要因

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が発生しました。