よく使う JVM チューニングフラグ
ヒープ、GC、JIT のオプションです。
「よく使う JVM チューニングフラグ」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
JVMをチューニングする理由
JVMには適切なデフォルト設定がありますが、負荷の高いサービスでは、ヒープサイズ、ガベージコレクタ、JITの動作を調整することがあります。
チューニングは最後の手段です。まずプロファイリングし、コードを修正してから、計測結果によって必要性が示された場合にのみフラグを使います。
ヒープサイズ:-Xmsと-Xmx
最も一般的な2つのフラグで、ヒープの範囲を設定します:
-Xms— 初期ヒープサイズ。-Xmx— 最大ヒープサイズ。
例:java -Xms512m -Xmx2g MyApp。長時間稼働するサーバーでは、-Xmsを-Xmxと同じ値に設定すると、リサイズによる一時停止を避けられます。
デフォルト値を確認する
JVMがどの値を選択したかを確認できます。Runtimeから現在のヒープ値を取得でき、-XX:+PrintFlagsFinalを使うと、すべてのフラグの有効値を出力できます。
この例では、実行中のJVMのメモリ上限を出力します。
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}コレクタを選択する
最新のJDKには、複数のガベージコレクタが用意されています:
-XX:+UseG1GC— デフォルト。バランス型で、リージョンベースです。-XX:+UseZGC— 一時停止が極めて短く、大きなヒープに適しています。-XX:+UseParallelGC— スループットを最大化しますが、一時停止は長くなります。-XX:+UseSerialGC— シングルスレッドで動作し、小規模なアプリケーションやコンテナに適しています。
G1の一時停止時間の目標
G1は一時停止時間を重視するコレクタです。目標を指定すると、それを達成しようとします:
-XX:MaxGCPauseMillis=200により、G1に一時停止を200ミリ秒前後に抑えるよう指示します。
これは保証ではなく、緩やかな目標です。低く設定しすぎると、小規模なコレクションを頻繁に実行することになり、スループットが低下する可能性があります。
低レイテンシー向けのZGC
数GBのヒープでも一時停止時間を1ミリ秒未満に保つ必要がある場合は、-XX:+UseZGCを指定してZGCを使用します。
処理の大部分をアプリケーションスレッドと並行して実行します。その代わり、G1と比べてCPUとメモリのオーバーヘッドが増えます。レイテンシーが重視されるサービスに適しています。
GCログ
GCをチューニングするには、まずGCの動作を確認する必要があります。統合ログを有効にします:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
これにより、すべてのコレクションがタイムスタンプと継続時間付きで記録されます。フラグを変更する前に、ログをビューア(またはJMC/JFR)に取り込んで、長いまたは頻繁な一時停止を見つけます。
コンテナとCPU
コンテナ内では、JVMがcgroupの制限を読み取ります。デフォルトでは、メモリ制限の一部をヒープに使用します。
-XX:MaxRAMPercentage=75.0は、コンテナメモリに対する割合としてヒープを設定します。-XX:ActiveProcessorCount=Nは、検出されたCPU数を上書きします。
これにより、オーケストレーターに強制終了されるようなメモリの過剰割り当てを防ぎます。
JITと診断フラグ
さらにいくつか便利なフラグを紹介します:
-XX:+HeapDumpOnOutOfMemoryError— OOM発生時にヒープをダンプし、事後解析に役立てます。-XX:HeapDumpPath=/tmp— ダンプの書き込み先を指定します。-XX:+PrintCompilation— JITコンパイルの動作を確認できます。
これらのコストは小さく、問題が起きたときに大きな効果を発揮します。
チューニングの原則
フラグに関する基本原則:
- 一度に1つのフラグだけ変更し、ベースラインと比較して再測定します。
- ブログ記事のフラグをそのままコピーしないでください。古いJVMを対象にしている可能性があります。
- ほとんどのアプリに必要なのは
-Xmxと、場合によってはコレクターの選択だけです。デフォルト設定は優れています。
メタスペースとスレッド
メモリ領域はヒープだけではありません:
-XX:MaxMetaspaceSizeはクラスメタデータ用の領域に上限を設定します。これを設定しないと、クラスローディングのリークによってネイティブメモリを使い果たす可能性があります。-Xssはスレッドごとのスタックサイズを設定します。非常に多くのスレッドを実行する場合は小さくし、再帰が深くなる場合は大きくします。
これらをチューニングする必要はほとんどありませんが、問題がヒープではなくネイティブメモリにある場合に、存在を知っていると役立ちます。
確認問題
-Xmsと-Xmxのフラグは何を制御しますか?
まとめ
知っておくべきフラグ:
-Xms/-Xmxはヒープの範囲を設定します。- コレクターを選択します:G1(デフォルト)、ZGC(停止時間が短い)、Parallel(スループット重視)。
- G1では
-XX:MaxGCPauseMillisを設定し、動作を観測するには-Xlog:gc*を有効にします。 - コンテナでは
MaxRAMPercentageを使用し、安全対策としてHeapDumpOnOutOfMemoryErrorを使用します。 - 一度に1つのフラグだけを変更して測定します。
よくある質問
「よく使う JVM チューニングフラグ」レッスンは無料ですか?
はい。「よく使う JVM チューニングフラグ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「よく使う JVM チューニングフラグ」で何を学びますか?
ヒープ、GC、JIT のオプションです。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「よく使う JVM チューニングフラグ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ボトルネックの特定
- Java Flight Recorder
- JDK Mission Control による分析
- よく使う JVM チューニングフラグ