0Pricing
Java Academy · レッスン

GC チューニングフラグと JVisualVM によるプロファイリング

ヒープサイズのフラグを設定し、GC ログを有効にして、実行中のアプリのヒープ使用量を JVisualVM でプロファイリングします。

「GC チューニングフラグと JVisualVM によるプロファイリング」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

GC をチューニングする理由

デフォルトの GC 設定は多くのアプリケーションで適切に機能しますが、高スループットや低レイテンシーが求められるワークロードではチューニングが必要になる場合があります。まず測定し、決して勘だけでチューニングしないでください。

ヒープサイズのフラグ

初期ヒープ(-Xms)と最大ヒープ(-Xmx)を設定します。本番環境では動的なサイズ変更による一時停止を防ぐため、両者を同じ値に設定します。まずは利用可能な RAM の 60~70% から始めます。

// Example production flags:
java -Xms2g -Xmx2g -XX:+UseG1GC MyApp
// Avoid:
java -Xmx8g MyApp  // initial = 256m, max = 8g → resizing pauses

Young 世代のサイズ

割り当ての多いアプリケーションでは Young Gen を大きくして、Minor GC の頻度を下げます。-Xmn または -XX:NewRatio(Old:Young の比率、デフォルトは 2)を使用します。

// Set Young Gen to 1 GB:
java -Xmx4g -Xmn1g MyApp
// Or via ratio:
java -Xmx4g -XX:NewRatio=3 MyApp  // 3GB old, 1GB young

G1 の一時停止時間の目標

-XX:MaxGCPauseMillis を設定して、G1 に希望する最大一時停止時間を伝えます。G1 は目標を満たすようにコレクションセットを調整しますが、これは目標であり、厳密な保証ではありません。

java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xmx8g MyApp
// G1 will try to keep pauses under 100 ms

GC スレッド数

-XX:ParallelGCThreads(stop-the-world のスレッド)と -XX:ConcGCThreads(G1/ZGC の並行スレッド)で並列度を制御します。

// On an 8-core machine:
java -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 MyApp

GC ロギングを有効にする(JVM 9 以降)

Xlog フレームワークを使用して GC イベントを記録します。ログをオフラインで分析し、長い一時停止、割り当ての急増、プロモーションの失敗を見つけます。

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=20m MyApp

巨大オブジェクトに関する警告

G1 リージョンの 50% を超えるサイズのオブジェクトは「humongous」と呼ばれ、Young Gen を経由せず Old Gen に直接移動します。これにより断片化が発生する可能性があります。大きなオブジェクトを小さくするか、リージョンサイズを大きくしてください。

// Increase G1 region size (range: 1 MB to 32 MB, must be power of 2):
java -XX:+UseG1GC -XX:G1HeapRegionSize=16m -Xmx16g MyApp

JVisualVisualVM の概要

JVisualVM(JDK 8 に同梱され、新しい JDK ではダウンロードして使用可能)は、ローカルおよびリモートの JVM プロセスのヒープ、GC、CPU、スレッドを監視する GUI を提供します。

リモート JVM に接続する

JVisualVM からリモート接続するには、サーバーで JMX を有効にします。対象 JVM の起動時に次のフラグを追加します。

// Remote JVM flags:
java -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=9090 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     MyApp

JVisualVM からヒープダンプを取得する

JVisualVM でプロセスを右クリックし、「Heap Dump」を選択します。ダンプには、ライブオブジェクト、保持サイズ、参照が表示されます。「OQL Console」を使用すると、SQL に似た構文でダンプを検索できます。

JVisualVM で CPU をプロファイリングする

Profiler タブに切り替え、「CPU」をクリックします。JVisualVM はメソッドを計測し、ホットなコールスタックを表示します。プロファイラーを停止すると、どのメソッドが最も多くの時間を消費したかを確認できます。

Java Flight Recorder と JVisualVM の比較

JFR のオーバーヘッドはより小さく(約 1~2%)、本番環境に適しています。プロファイリング中の JVisualVM はオーバーヘッドが大きいため、開発に適しています。本番環境では JFR を、開発時のデバッグでは JVisualVM を使用します。

確認問題

G1 の最大 GC 一時停止時間の目標を設定するフラグは何ですか。

まとめ

本番環境では -Xms == -Xmx を設定します。G1 では -XX:MaxGCPauseMillis をチューニングします。Xlog で GC ロギングを有効にします。開発時のデバッグには JVisualVM を、本番環境のプロファイリングには JFR を使用します。

よくある質問

「GC チューニングフラグと JVisualVM によるプロファイリング」レッスンは無料ですか?

はい。「GC チューニングフラグと JVisualVM によるプロファイリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「GC チューニングフラグと JVisualVM によるプロファイリング」で何を学びますか?

ヒープサイズのフラグを設定し、GC ログを有効にして、実行中のアプリのヒープ使用量を JVisualVM でプロファイリングします。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「GC チューニングフラグと JVisualVM によるプロファイリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JVM ヒープ領域とオブジェクトのライフサイクル
  2. GC アルゴリズム:Serial、G1、ZGC、Shenandoah
  3. メモリーリークの検出と修正
  4. GC チューニングフラグと JVisualVM によるプロファイリング
← Java Academyに戻る