Hitachi

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


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ヒープ領域の最大サイズを設定する手順は次のとおりです。

  1. SerialGCを有効にして,最大の負荷を掛けた状態でアプリケーションを実行します。

  2. 拡張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]
    …
  3. FullGC発生後の拡張verbosegc情報を何度か収集します。

  4. 手順3.で収集したFullGC発生後のJavaヒープ領域のサイズのうち,最も大きな値を,アプリケーションの動作に必要なJavaヒープ領域の最小サイズとします。

  5. 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停止時間が短くなる代わりにメモリの消費量が増えるなどの悪影響があるため,お使いの環境に合わせて実施してください。

(4) OSのパラメタ設定(Linuxの場合)

ZGCでは多くのメモリマップ領域を使用するため,OSで定義されているプロセスごとのメモリマップ領域の上限を増やしてください。

手順は次のとおりです。

  1. 次の計算式に従って,ZGC使用時のJavaプロセスのメモリマップ領域の数を算出してください。

    ZGC使用時のJavaプロセスのメモリマップ領域の数 = Javaヒープ領域の最大サイズ / 2メガバイト × 3 × 1.2
  2. 算出した値を,/proc/sys/vm/max_map_countに設定してください。