ネイティブ・イメージでの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:+FlightRecorderと-XX:StartFlightRecordingを一緒に使用します。たとえば:
./javaapplication -XX:+FlightRecorder -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イベントの記録は、WindowsのGraalVMディストリビューションではサポートされていません。
 - JFRは、GraalVM JDK 11でビルドされたネイティブ実行可能ファイルでのみサポートされています。