ネイティブ・イメージでのJDK Flight Recorder (JFR)
JDK Flight Recorder (JFR)は、JVMおよびJVMで実行されているアプリケーションに関する情報を取得するためのイベント・レコーダです。GraalVMネイティブ・イメージはJFRイベントを使用したネイティブ実行可能ファイルのビルドをサポートしており、ユーザーは、Java HotSpot VMでJFRを使用する場合と同様に、jdk.jfr.Event
APIを使用できます。
ネイティブ実行可能ファイルの実行時にJFRイベントを記録するには、JFRサポートおよびJFR記録を有効にする必要があります。
実行時のJFRサポートおよびイベントの記録の追加
JFRイベントがサポートされるネイティブ実行可能ファイルをビルドするには、まずビルド時にJFRを含めてから、システムを有効にし、記録を開始し、ネイティブ実行可能ファイルの実行時にロギングを構成する必要があります。
JFRを使用してネイティブ実行可能ファイルをビルドするには、--enable-monitoring=jfr
フラグを使用します:
native-image --enable-monitoring=jfr JavaApplication
システムを有効にし、記録を開始し、実行時にロギングを構成するために、次のオプションがサポートされています:
-XX:+FlightRecorder
: JFRの有効化に使用します-XX:StartFlightRecording
: アプリケーションの起動時に記録を開始するために使用します-XX:FlightRecorderLogging
: JFRシステムのログ出力の構成に使用します
JFRを有効にして記録を開始するには、-XX:StartFlightRecording
を使用します。たとえば:
./javaapplication -XX:StartFlightRecording="filename=recording.jfr"
デモの実行
この非常に単純なデモ・アプリケーションをネイティブ・イメージに変換し、そこでJFRイベントを使用する方法を確認します。次のコードをExample.javaファイルに保存します。
import jdk.jfr.Event;
import jdk.jfr.Description;
import jdk.jfr.Label;
public class Example {
@Label("Hello World")
@Description("Helps programmer getting started")
static class HelloWorldEvent extends Event {
@Label("Message")
String message;
}
public static void main(String... args) {
HelloWorldEvent event = new HelloWorldEvent();
event.message = "hello, world!";
event.commit();
}
}
JFR記録をさらに構成するか、ロギングを有効にできます。
JFR記録の構成
JFR記録を構成するには、キーと値のペアのカンマ区切りのリストを-XX:StartFlightRecording
オプションに渡します。たとえば:
-XX:StartFlightRecording="filename=recording.jfr,dumponexit=true,duration=10s"
次のキーと値のペアがサポートされています:
名前 | デフォルト値 | 説明 |
---|---|---|
name | なし | 記録の識別に使用できる名前(name=MyRecordingなど) |
settings | なし | 設定ファイル(profile.jfc、default.jfcなど)、settings=myprofile.jfcなど |
delay | なし | 記録開始の秒(s)、分(m)、時間(h)または日(d)単位の遅延時間(delay=5hなど) |
duration | 無限(0) | 秒(s)、分(m)、時間(h)または日(d)単位の記録期間(duration=300sなど) |
filename | なし | 結果の記録ファイル名(filename=recording1.jfrなど) |
maxage | 制限なし(0) | 記録されたデータをディスク上に保存する秒(s)、分(m)、時間(h)または日(d)単位の最大時間(60mなど)または制限なしの場合は0。たとえば、"maxage=1d" |
maxsize | 制限なし(0) | ディスク上に保存するKB(k)、MB(M)またはGB(G)単位の最大バイト数(500Mなど)または制限なしの場合は0。たとえば、"maxsize=1G" |
dumponexit | false | JVMの停止時に実行中の記録をダンプするかどうか(dumponexit=trueなど) |
JFRシステム・ロギングの構成
個別のフラグ-XX:FlightRecorderLogging
を使用して、JFRシステムのロギングを構成できます。使用法は-XX:FlightRecorderLogging=[tag1[+tag2...][*][=level][,...]]
です。たとえば:
-XX:FlightRecorderLogging=jfr,system=debug
-XX:FlightRecorderLogging=all=trace
-XX:FlightRecorderLogging=jfr*=error
- このオプションが設定されていない場合、ロギングは
WARNING
レベルで有効になります。 - このオプションを空の文字列に設定すると、ロギングは
INFO
レベルで有効になります。 - このオプションをdisableに設定すると、ロギングが完全に無効になります。
使用可能なログ・レベルは、trace、debug、info、warning、error、off
です。
使用可能なログ・タグは、all、jfr、system、event、setting、bytecode、parser、metadata、dcmd
です。
それ以外の場合、このオプションでは、タグの組合せのカンマ区切りリストが必要で、それぞれにオプションのワイルドカード(*
)およびレベルがあります。
- レベルなしのタグの組合せには、デフォルト・レベルの
INFO
が指定されます。 - 指定されたタグの組合せと一致するタグがあるメッセージは、タグ組合せのレベルを満たす場合に記録されます。
- タグの組合せにワイルドカードがない場合、完全に同じタグを持つメッセージのみが照合されます。それ以外の場合、タグがタグの組合せのサブセットであるメッセージが照合されます。
- 複数のタグの組合せがメッセージのタグと一致する場合は、右端のタグが適用されます。
- 一致するタグの組合せがないタグを含むメッセージは、デフォルトの
WARNING
レベルでログに記録するように設定されます。 - このオプションでは、大文字と小文字が区別されません。
関連ドキュメント
現在の制限事項
JFRサポートは現在不完全です。たとえば、VM内部イベントがほとんど存在しません。ただし、JFRには現在、カスタムおよびシステム・イベント、ディスクベースの記録およびスタック・トレースの機能が含まれています。ネイティブ・イメージでサポートされているJFRイベントおよび機能の完全なリストを確認するには、このGitHubのイシューを参照してください。
ノート: WindowsのGraalVMディストリビューションには、JFRイベント記録は含まれていません。