2.4.2 ZGCのチューニング
ここでは,ZGCを使用するためのチューニング方法について説明します。
(1) ZGCでのGCの考え方
ZGCを使用している場合,GCは「先行して,前もって,予防的に」実行する必要があります。
ZGCでは,多くのGC処理をアプリケーションと同時に実行しています。そのため,アプリケーションがオブジェクトを作成する速度よりも,GC処理でオブジェクトを削除する速度の方が遅い場合,Javaヒープを有効に使用できません。
(2) チューニングの流れ
ZGCを使用している場合のチューニングでは,OutOfMemoryを抑制するためにJavaヒープ領域の最大サイズを設定します。Javaヒープ領域の最大サイズの設定以外の方法でOutOfMemoryを抑制する場合は,「2.4.2(3) GC停止時間およびスループットの改善方法」を参照してください。
(a) Javaヒープ領域の最大サイズの設定
Javaヒープ領域の最大サイズを設定する手順は次のとおりです。
-
SerialGCを有効にして,最大の負荷を掛けた状態でアプリケーションを実行します。
-
拡張verbosegc情報から,FullGC発生後のJavaヒープ領域のサイズを確認します。
FullGC発生後の拡張verbosegc情報の出力例を次に示します。下線部分がFullGC発生後のJavaヒープ領域のサイズです。
… [VGC]<Wed Dec 28 14:12:05 2022>[Full GC 31780K->30780K(32704K), 0.2070500secs][DefNew::Eden: 3440K->1602K(3456K)][DefNew::Survivor:58K->0K(64K)][Tenured: 28282K->29178K(29184K)][Metaspace:1269K->1269K(4096K)][cause:ObjAllocFail][User: 0.0156250 secs][Sys: 0.0312500 secs] …
-
FullGC発生後の拡張verbosegc情報を何度か収集します。
-
手順3.で収集したFullGC発生後のJavaヒープ領域のサイズのうち,最も大きな値を,アプリケーションの動作に必要なJavaヒープ領域の最小サイズとします。
-
Javaヒープ領域の最大サイズを設定します。
-Xmxオプションを設定します。GC実行中のオブジェクトを余裕を持って作成できるようにするため,Javaヒープ領域の最大サイズは,手順4.で確認した値の1.5倍〜2倍に設定することを推奨します。
なお,Javaヒープ領域の初期サイズ(-Xmsオプション)は,最大ヒープサイズと同じ値に設定することを推奨します。
(b) OutOfMemoryの発生調査
ZGCを有効にして,システムの検証を行います。OutOfMemoryが発生しているかどうかを確認し,結果に応じて次の作業を実施してください。
-
OutOfMemoryが発生している場合
-Xmsオプションの値を大きくしたあと,再度「(1) Javaヒープ領域の最大サイズの設定」の手順を実施します。
-
OutOfMemoryが発生していない場合
チューニングは完了です。停止時間をさらに短くしたい場合,またはスループットを改善したい場合は,「2.4.2(3) GC停止時間およびスループットの改善方法」を参照してください。
(3) GC停止時間およびスループットの改善方法
Javaヒープ領域の最大サイズの調整以外にGC停止時間およびスループットを改善する方法について説明します。ただし,この項で説明する方法は,GC停止時間が短くなる代わりにメモリの消費量が増えるなどの悪影響があるため,お使いの環境に合わせて実施してください。
-
GC停止時間をより短くしたい場合
-
-XX:ParallelGCThreadsオプションの値を大きくします
GC停止時間が短くなる代わりに,メモリの消費量が増えます。
-
-
スループットをより向上させたい場合
-
-XX:ConcGCThreadsオプションの値を小さくします
スループットが向上する代わりに,OutOfMemoryが発生しやすくなります。
-
-XX:ParallelGCThreadsを大きくします
スループットが向上する代わりに,メモリの消費量が増えます。
-