Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon GARBAGEコレクションの一時停止を最小限に抑えるためにJVMパラメーターを構成するにはどうすればよいですか


GARBAGEコレクションの一時停止を最小限に抑えるためにJVMパラメーターを構成するにはどうすればよいですか


Garbage Collection(GC)の一時停止を最小限に抑えるためにJVMパラメーターを構成するには、さまざまなガベージコレクターの基本的な操作とJVMで利用可能なチューニングメカニズムを理解することが重要です。構成プロセスには、適切なガベージコレクションアルゴリズムの選択、ヒープサイズの調整、一時停止時間の目標の構成、スレッドパラメーター、およびメモリ領域の最適化が含まれます。以下は、権威ある情報源とベストプラクティスに基づいてGCの一時停止を最小限に抑えるためのJVMチューニングの詳細な統合です。

###適切なゴミコレクターを選択します

JVMには、スループット、一時停止時間、およびリソースの使用に関する特性が異なる複数のガベージコレクションアルゴリズムを提供しています。

- シリアルGC:GCに単一のスレッドを使用します。コレクション中にすべてのアプリケーションスレッドを停止し、長い一時停止をもたらします。通常、大規模なアプリケーションで一時停止を最小限に抑えるのに適していません。
- パラレルGC:複数のスレッドを使用してガベージコレクションを実行し、複数のCPUコアを活用することにより、シリアルGCと比較して一時停止時間を短縮します。スループット指向ですが、それでもGC中にアプリケーションスレッドを一時停止します。
-CONCURRENT MARK-SWEEP(CMS)GC:アプリケーションと同時にガベージコレクション作業の多くを実行し、特定のGCフェーズでアプリケーションを一時的に一時停止するだけで、一時停止時間を大幅に短縮します。低遅延アプリケーションに適しています。
- 第一(G1)GC:ヒープを領域に分割し、最もゴミの領域を収集することに焦点を当てます。同時位相と並列相を混合することにより、予測可能な一時停止時間と優れたスループットを提供することを目的としています。多くの場合、最新のJVMバージョンのデフォルトです。
-ShenandoahとZGC:これらの低遅延のコレクターは、非常に短いまたはほとんど知覚できない一時停止を目指して、大規模なヒープと非常にレスポンシブなアプリケーションに適している、すべてまたはほとんどのGC作業を同時に実行します。

適切なコレクターを選択すると、最大容認された一時停止時間、ヒープサイズ、ワークロードの特性などのアプリケーション要件に依存します。

###ヒープサイズの構成

ヒープサイズは、GC頻度と一時停止期間に直接影響します。

- 初期および最大ヒープサイズを等しく設定します:同じ値で `-xms`と` -xmx`を使用すると、ヒープのサイズ変更が回避され、実行時に一時停止が導入されます。
- 適切なヒープサイズ:ハイプを不足させると、頻繁にコレクションが発生し、一時停止が増加します。ただし、オーバーアロッコイはGCサイクルが長くなります。アプリケーションメモリのニーズに基づいてバランスを見つけます。
-GCログとヒープ使用メトリックを監視して、ヒープサイズを適切に調整します。

GCの一時停止時間を制御します

JVMは、最大GCの一時停止時間に目標を設定するパラメーターを提供します。

- `-xx:maxgcpausemillis =`:コレクターが満たすために、ミリ秒単位でターゲットの最大一時停止時間を設定します。 JVMは保証されていませんが、この一時停止時間を超えないように、スループットとGCの作業を調整しようとします。
- このパラメーターをG1 GCまたは時間の目標を一時停止する他のコレクターで使用して、JVMをスループットとレイテンシのバランスをとることを誘導します。

###スレッドと並列性

ガベージコレクション中に複数のスレッドを活用すると、一時停止期間が減少します。

-` -xx:parallelgcthreads = `:GCの並列フェーズで使用されるスレッドの数を設定します。スレッドが増えると、一時停止時間を短縮できますが、CPUの使用量も増加する可能性があります。
-` -xx:concgcthreads = `:CMSやG1などの同時コレクターの場合、同時フェーズを実行するスレッドの数を設定します。
- 最適なスレッドカウントは、利用可能なCPUコアの数とワークロードと一致する必要があります。スレッドをオーバーサブスクライブすると、パフォーマンスを低下させる可能性があります。

Tuning Young and Old Generationサイズ

ヒープは通常、世代と古い世代に分かれています。サイズを調整すると、GCの動作が影響します。

- 若い世代のサイズ:若い世代が大きくなると、マイナーGCの頻度が減少しますが、マイナーなGCの一時停止時間が増加します。オブジェクトの割り当てレートに基づいて調整します。
- 古い世代のサイズ:メジャー/フルGCが実行される頻度とその期間に影響します。
-G1GCは、ヒープを多くの等しくサイズの領域に分割し、動的にサイズを管理しますが、「XX:ingiatingHeapocCupancePercent」のようなパラメーターで開始しきい値を調整することができます。

###ゴミコレクター固有のパラメーター

G1 GCの場合、現代のJVMで一般的に使用されています。
- `-xx:+useg1gc`:g1 gcを有効にします。
-` -xx:maxgcpausemillis = `:時間ターゲットを一時停止します。
-` -xx:initiatingheapoccupancepercent = `:ヒープがこの占有率に達したときに同時マーキングを開始します。
- `-xx:+usestringdededuplication`:文字列を強化することにより、メモリフットプリントを削減します。
- G1の一時停止時間の目標を妨げる可能性があるため、若い世代のサイズを明示的に設定しないでください。

CMS GCの場合:
- `-xx:+useconcmarksweepgc`:cmsを有効にします。
- 開始しきい値とスレッドカウントを調整することにより、グローバルストップザワールドの一時停止を減らすことに焦点を合わせます。

並列GC(スループット指向)の場合:
- `-xx:+useparallelgc`および` -xx:+useparalleloldgc`:若い世代と古い世代に並列GCを有効にします。
- 「-xx:parallelgcthreads」を使用してGCスレッドの数を調整します。

###オブジェクトの割り当て率を削減します

新しいオブジェクトが作成される速度を下げると、GC圧力が低下します。

- コードをプロファイルおよび最適化して、不要なオブジェクトの作成を最小限に抑えます。
- 可能な場合はオブジェクトのプーリングと再利用を使用します。
-JVMパラメーターを調整して、オブジェクトの割り当てパターンを改善するために内部メモリ領域を調整します。

###明示的なGC呼び出しを避けてください

- `-xx:+disableexplicitgc`を使用して完全なGCポーズをトリガーできるアプリケーションコードまたは外部ツールからの明示的なGC呼び出しを無効にします。

###監視とロギング

GCの動作を理解して調整するには、詳細なGCロギングを有効にします。

-` -xlog:gc*`を使用して、unifiedロギングをサポートするJVMS(Java 9+)を使用します。
- 古いjvmsでは、 `-xx:+printgcdetails -xx:+printgcdatestamps -xloggc:`を使用します。

ログを分析して、一時停止の原因を識別し、それに応じて調整します。

###一般的な推奨事項

- 時代遅れのJVM引数を削除して、きれいなスレートで調整を開始します。
- 生産のような環境でのテストの変更。
-Java Flight Recorder、VisualVM、または商用プロファイラーなどのツールを使用して、GCおよびメモリ使用量データを収集します。
- 観測されたGCの一時停止時間、スループット、およびアプリケーションの応答性に基づいた反復チューニング手順。

In summary, minimizing JVM garbage collection pauses involves selecting the appropriate garbage collector (preferably G1, ZGC, or Shenandoah for low pause requirements), properly sizing heap and generations, setting pause time goals, tuning concurrency threads, minimizing object allocation rate, disabling explicit GCs, and careful monitoring.詳細は、アプリケーションワークロード、ヒープサイズ、JVMバージョン、ハードウェア特性に依存します。調整は、監視ツールと詳細なGCログで段階的に検証して、スループットと一時停止時間の望ましいバランスを達成する必要があります。

このアプローチにより、JVMのゴミコレクションは、アプリケーションのパフォーマンスの混乱を最小限に抑えて効率的に動作することが保証されます。