Java Flight Recorder
低オーバーヘッドのプロファイリングです。
「Java Flight Recorder」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
JFRとは
Java Flight Recorder (JFR)は、JVMに直接組み込まれたプロファイリングおよびイベント収集エンジンです。
メソッドサンプル、アロケーション、GC、ロック、I/Oなどの詳細なランタイムイベントを、オーバーヘッドを非常に小さく抑えながらバイナリの.jfrファイルに記録します。JDKに含まれているため、追加のエージェントは必要ありません。
低オーバーヘッドが重要な理由
従来のインストルメンテーション型プロファイラでは、アプリケーションの速度が2倍以上低下し、知りたいはずの計測時間そのものが歪むことがあります。
JFRは通常約1%のオーバーヘッドで本番環境で実行できるように設計されています。つまり、常時有効にしておき、ラボでのテストだけでなく、実際にインシデントが発生したときにレコーディングを取得できます。
起動時にレコーディングを開始する
アプリケーションの起動時にJVMフラグでJFRを有効にします:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
これにより60秒間イベントを記録し、その後app.jfrに書き込みます。JVMが終了するまで実行されるレコーディングを開始することもできます。
jcmdで制御する
実行中のJVMに対して、jcmdを使ってレコーディングの開始、停止、ダンプを行うこともできます:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
すでに問題が発生しているプロセスからスナップショットを取得するのに最適です。
設定:defaultとprofile
JFRには、組み込みの構成が2つ用意されています:
- default — オーバーヘッドが最小で、継続的な本番利用に適しています。
- profile — より詳細なサンプリングを行います。コストはやや高く、集中的な調査に使います。
settings=profileで選択します。個々のイベントを調整するカスタム.jfc設定ファイルを作成することもできます。
JFRが記録する内容
JFRは、次のような豊富なイベントを収集します:
- 実行サンプル(CPU時間がどこで使われているか)。
- オブジェクトの割り当てとTLABの活動。
- ガベージコレクションの一時停止。
- ロック競合(
jdk.JavaMonitorWait)。 - ファイルとソケットのI/O、スレッドのパーク、例外。
各イベントには、タイムスタンプ、継続時間、スタックトレースが含まれます。
カスタムイベント
ビジネスロジックの処理時間を測定するために、独自のJFRイベントを定義できます。jdk.jfr.Eventを継承してアノテーションを付け、処理の前後でbegin()/commit()を呼び出します。
これはJFR APIの、単体で利用しやすい部分です。実際のレコーディングにはJVMフラグが必要ですが、イベントクラスはどのJDKでもコンパイルして実行できます。
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}継続的なレコーディング
長時間稼働するサービスでは、サイズまたは保持期間に上限を設けた継続的なレコーディング(リングバッファ)を実行します。
新しいイベントが到着すると古いイベントが破棄されるため、ディスク使用量は上限内に収まります。インシデントが発生したらバッファをダンプするだけで、直前数分間のデータをすぐに取得できます。
終了時にダンプする
StartFlightRecordingフラグにdumponexit=trueを追加すると、JVMの終了時にJFRがバッファを書き込みます。
バッファサイズの設定には-XX:FlightRecorderOptionsを組み合わせます。これにより、まもなく終了するプロセスからも確実にデータを取得できます。
ファイルを読み取る
.jfrファイルはバイナリです。JDK Mission Control(次のレッスン)で視覚的に分析するか、jdk.jfr.consumer APIとRecordingFileを使ってプログラムから分析します。
コマンドラインのjfr print app.jfrを使えば、簡単な検索用にイベントをテキストとしてダンプすることもできます。
イベントをリアルタイムでストリーミングする
JDK 14以降、JFRはjdk.jfr.consumer.RecordingStream APIによるイベントストリーミングをサポートしています。
ファイルにダンプして後から開く代わりに、発生したイベントを購読してリアルタイムに反応できます。たとえば、GCの一時停止がしきい値を超えたときにアラートを送信できます。これによりJFRは、事後分析用のツールにとどまらず、ライブ監視の情報源になります。
クイックチェック
JFRを本番環境で実行し続けられる主な理由は何でしょうか?
まとめ
JFRはJVMに組み込まれたフライトデータレコーダーです:
- オーバーヘッドが小さく、本番環境でも安全にイベントを収集して
.jfrファイルに保存できます。 -XX:StartFlightRecordingまたはjcmd JFR.startで開始します。- defaultまたはprofile設定を選び、カスタムイベントを定義できます。
- 継続的なリングバッファレコーディングと
dumponexitを使います。 - 次はJDK Mission Controlで分析します。
よくある質問
「Java Flight Recorder」レッスンは無料ですか?
はい。「Java Flight Recorder」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「Java Flight Recorder」で何を学びますか?
低オーバーヘッドのプロファイリングです。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Java Flight Recorder」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ボトルネックの特定
- Java Flight Recorder
- JDK Mission Control による分析
- よく使う JVM チューニングフラグ