マイクロサービスの起動 JVM パラメーターのチューニングの実践
1.1 JVM 起動パラメータの構成
サーバー構成
ハードウェア | リソース |
---|---|
メモリ | 6Gi |
CPU | 4 核 |
APP_PARAM="-Xmx2g -Xms2g -Xmn768m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xss256k -XX:+UseG1GC -XX:+AlwaysPreTouch -XX:-ResizePLAB -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2"
1.2 説明
これは、いくつかの Java 仮想マシン (JVM) パラメータを含む変数 APP_PARAM です。これらのパラメータは、Java プログラムの起動時に JVM のさまざまなオプションを構成するために使用されます。これらのパラメータの意味を 1 つずつ説明しましょう。
JVMパラメータ | 説明する |
---|---|
-Xmx2g |
JVM の最大ヒープ メモリを 2GB に設定します。これは、Java ヒープが使用できるメモリの最大量です。 |
-Xms2g |
JVM の初期ヒープ メモリを 2GB に設定します。これは Java ヒープの初期メモリ サイズで、JVM の起動時にヒープに割り当てられます。 |
-Xmn768m |
JVM の初期の若い世代サイズを 768MB に設定します。若い世代は、新しく作成されたオブジェクトを格納するために使用される Java ヒープ内の領域です。 |
-XX:MetaspaceSize=256m |
Metaspace の初期サイズを 256MB に設定します。メタスペースは、クラスのメタデータを保存するために使用されます。 |
-XX:MaxMetaspaceSize=256m |
メタスペースの最大サイズを 256MB に設定します。メタスペースがこのサイズに達すると、JVM はガベージ コレクションをトリガーして、使用されなくなったクラス メタデータを再利用します。 |
-Xss256k |
各スレッドのスタック サイズを 256KB に設定します。これにより、各スレッドが使用できるメモリの量が決まります。 |
-XX:+UseG1GC |
G1 (ガベージファースト) ガベージ コレクターを使用するように指定します。G1 は、大容量メモリとマルチコア プロセッサを搭載したアプリケーションに適した最新のガベージ コレクターです。 |
-XX:+AlwaysPreTouch |
以降の使用時の遅延を避けるために、JVM の起動時にヒープのすべてのページが事前に割り当てられ、データが設定されるように指定します。 |
-XX:-ResizePLAB |
適応型 Parallel Lab (PLAB) サイズ変更を無効にします。PLAB は、オブジェクト割り当てを最適化するために G1 コレクターで使用される手法です。 |
-XX:+ParallelRefProcEnabled |
並列参照処理を有効にします。これにより、G1 コレクターは参照を処理するときに並列処理を使用できるようになります。 |
-XX:+ExplicitGCInvokesConcurrent |
System.gc() が明示的に呼び出されたときに、同時マーキング サイクルと並行してガベージ コレクションを実行できるようにします。 |
-XX:MaxGCPauseMillis=200 |
希望する最大 GC 一時停止時間を 200 ミリ秒に設定します。G1 コレクターは、GC 一時停止時間をこの範囲内に維持しようとします。 |
-XX:ParallelGCThreads=4 |
並列ガベージ コレクションのスレッド数を 4 に設定します。これにより、並列ガベージ コレクションを実行するときに使用されるスレッドの数が決まります。 |
-XX:ConcGCThreads=2 |
同時ガベージ コレクション スレッドの数を 2 に設定します。これにより、同時ガベージ コレクション中に使用されるスレッドの数が決まります。 |
- これらの JVM パラメータは、特定のアプリケーションおよびハードウェア環境に応じて調整して、Java プログラムのパフォーマンスとメモリ使用量を最適化できます。
- 一部のパラメータは、Java バージョンや JVM 実装ごとに異なる効果をもたらす可能性があるため、ケースバイケースでテストとチューニングを行うことをお勧めします。
1.3 JVMパラメータ最適化のアイデア
JVM パラメータの最適化は複雑なプロセスであり、特定のアプリケーションやハードウェア環境に応じて調整する必要があります。
推奨される最適化をいくつか示します。
1.3.1 ヒープメモリサイズの調整
アプリケーションの実際のメモリ要件に応じて、ヒープの最大メモリ-Xmx
と初期メモリを適切に増やすことを検討してください-Xms
。ただし、過剰に割り当てないようにしてください。また、ガベージ コレクションが頻繁に発生するような大きすぎるヒープも避けてください。
1.3.2 若い世代の規模
-Xmn は、若い世代の初期サイズを設定します。アプリケーションのオブジェクト作成頻度とヒープ サイズに応じて、若い世代のサイズを適度に調整します。若い世代が小さいとガベージ コレクションの頻度が高くなる可能性があり、若い世代が大きいとガベージ コレクションの頻度が低くなる可能性があります。
1.3.3 メタスペースのサイズ
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
メタスペースの初期サイズと最大サイズを設定します。アプリケーションのクラス読み込み要件に従って、メタスペースのサイズを適度に増やします。
1.3.4 スタックサイズ
-Xss
各スレッドのスタック サイズを設定します。アプリケーションのスレッド要件に従ってスタック サイズを適切に調整します。スタック サイズが大きすぎると、使用可能なメモリによってスレッド数が制限される場合があります。
1.3.5 ガベージコレクターの選択
-XX:+UseG1GC
特に大規模なメモリとマルチコア プロセッサ環境では、G1 ガベージ コレクタを使用するのが良い選択です。
1.3.6 ガベージコレクションパラメータ
ガベージコレクタのパラメータは、-XX:MaxGCPauseMillis
、 、-XX:ParallelGCThreads
など、実際の状況に応じて調整してください-XX:ConcGCThreads
。これらのパラメータを調整するには、実際のアプリケーション シナリオでのパフォーマンス テストと最適化が必要です。
1.3.7 事前割り当てメモリ
-XX:+AlwaysPreTouch は、JVM の起動時にヒープ メモリを事前に割り当て、後続のメモリ割り当てによって引き起こされる遅延を回避します。
1.3.8 ResizePLAB を無効にする
-XX:-ResizePLAB
Parallel Lab (PLAB) サイジングは無効にすることができます。
- JVM パラメータを最適化するには、アプリケーションのパフォーマンス要件、ハードウェア環境、および利用可能なメモリ リソースを包括的に考慮する必要があります。
- 運用環境でテストとパフォーマンス評価を実施し、パラメータを徐々に調整して最高のパフォーマンスとメモリ使用率を達成することをお勧めします。
- 同時に、過剰な最適化に注意し、過剰なパラメーター調整によって新たな問題が発生しないように注意してください。