読者です 読者をやめる 読者になる 読者になる

【Java】G1GCに使用するオプションについて

Java
スポンサーリンク

G1GCのオプションについてまとめました。

G1GCオプション

G1GCを使用するには-XX:+UseG1GCオプションを指定する必要があります。その他のオプションは以下の通りです。

オプション デフォルト 概要
-XX:G1HeapRegionSize=N 以下参照 リージョンのサイズを指定
-XX:MaxGCPauseMillis=N 200 停止期間の目標値
-XX:G1NewSizePercent=N 5 若い世代の最小ヒープサイズ割合
-XX:G1MaxNewSizePercent=N 60 若い世代の最大ヒープサイズ割合
-XX:ParallelGCThreads=N 以下参照 GCスレッド数
-XX:ConcGCThreads=N 以下参照 マーキングスレッド数
-XX:InitiatingHeapOccupancyPercent=N 45 マーキングサイクル開始の閾値
-XX:G1MixedGCLiveThresholdPercent=N 85
-XX:G1HeapWastePercent=N 5
-XX:G1MixedGCCountTarget=N 8
-XX:G1OldCSetRegionThresholdPercent=N 10
-XX:G1ReservePercent=N 10

-XX:G1HeapRegionSize

G1でのヒープは固定サイズのリージョンに分割されています。このサイズをオプションで指定する場合は、リージョンのサイズは 2 の累乗で 1MB から 32MB の範囲で指定する必要があります。ヒープの初期サイズXmsを基にリージョンを約 2048 個以上に分割できる値のうち最小のものを使用してください。G1はリージョンが 2,048 個程度の状況を前提として設計されています。

オプションで指定しない場合も起動時にヒープの初期サイズXmsの値を元に決定され、常に一定です。デフォルトは 0 であるため、以下の式にもとづいて算出されます。直接指定する場合も参考にしてください。2 の累乗以外の値が指定された場合は最も近い 2 の累乗の値に切り下げられます。

ヒープの初期サイズ リージョンサイズ
4GB未満 1MB
4GB以上 ~ 8GB未満 2MB
8GB以上 ~ 16GB未満 4MB
16GB以上 ~ 32GB未満 8MB
32GB以上 ~ 64GB未満 16MB
64GB以上 32MB

その他注意点としては、① 初期サイズXmsと最大サイズXmxが大きく異る場合はリージョンの数が多くなりすぎることがあるため、リージョンのサイズを増やす事を検討する。

② G1ではリージョンのサイズの 50% を超えるオブジェクトは超巨大オブジェクトとみなされるため、そのようなオブジェクトがある場合は基本的に 1 つのリージョンに収まるようにサイズを計算する。ただしオブジェクトのサイズを削減することも考えましょう。

-XX:MaxGCPauseMillis

MaxGCPauseMillis はデフォルトで 200 (ミリ秒) ですが、アプリケーションスレッドの停止を伴うフェーズで、停止時間がこの値を超えた場合、G1 は指定された目標値を達成できるように、状況の緩和を試みようとしてアルゴリズムを動的に調整します。FullGC が発生する場合には値を増やすことを検討してください。

 -XX:MaxGCPauseMillis

-XX:ParallelGCThreads

アプリケーションスレッドが停止するフェーズで使われる GC のスレッド数を変更できます。デフォルト値は論理CPU数が設定されます (最大値は8)。実行環境の論理CPU数が9以上の場合は(8+(CPU数−8)×(5÷8))で計算されます。

 -XX:ParallelGCThreads

-XX:ConcGCThreads

マシン上に十分な CPU が搭載されているのであれば、バックグラウンドでマーク付けを行うスレッドの数を増やすことを検討します。デフォルト値は(ParallelGCThreads+2)/4で計算されます。小数点以下は切り捨てで最低は1です。ParallelGCThreads を超える値は設定できません。

 -XX:ConcGCThreads

その他参考情報

 ガベージファースト・ガベージ・コレクタのチューニング

 G1GCの概要

 G1GCのメモリー構造とGCの流れについて