ネイティブ・イメージでのJDK Flight Recorder (JFR)
JDK Flight Recorder (JFR)は、JVMおよびJVMで実行されているアプリケーションに関する情報を取得するためのイベント・レコーダです。GraalVMネイティブ・イメージはJFRイベントを使用したネイティブ実行可能ファイルのビルドをサポートしており、ユーザーは、Java HotSpot VMでJFRを使用する場合と同様に、jdk.jfr.Event
APIを使用できます。
ビルド時のJFRサポートの有効化および実行時のイベントの記録
JFRサポートはデフォルトで無効になっており、ビルド時に明示的に有効にする必要があります。
ノート: JFRイベント記録は、Windowsのネイティブ・イメージではまだ使用できません。
JFRを使用してネイティブ実行可能ファイルをビルドするには、--enable-monitoring=jfr
オプションを使用します:
native-image --enable-monitoring=jfr JavaApplication
記録を開始して実行時にロギングを構成するために、次のオプションがサポートされています:
-XX:StartFlightRecording
: アプリケーションの起動時に記録を開始します-XX:FlightRecorderLogging
: JFRのログ出力を構成します
JFR記録を開始するには、実行時に-XX:StartFlightRecording
を使用するだけです。たとえば:
./javaapplication -XX:StartFlightRecording="filename=recording.jfr"
JFR記録の構成
HotSpotで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機能について説明します。
メソッド・プロファイリングおよびスタック・トレース
JFRのメソッド・プロファイリングでは、セーフポイント・サンプリングと非同期サンプリングという2つのタイプのサンプリングがサポートされています。非同期サンプラはデフォルトで有効になっていますが、セーフポイント・サンプラはオンデマンドでのみ使用されます。非同期サンプリングは、セーフポイント・バイアスを回避するという利点を提供します。これは、プロファイラがアプリケーションのすべてのポイントを同じ確率でサンプリングしない場合に発生します。このシナリオでは、サンプラはセーフポイントでのみサンプリングを実行できるため、プロファイルにバイアスが挿入されます。
どちらのサンプラも、指定した頻度でイベントjdk.ExecutionSample
を定期的に生成します。これらのサンプルは、JDK Mission ControlやVisualVMなどのアプリケーションで表示できます。また、HotSpotのスタック・トレースをサポートする他のJFRイベントも、ネイティブ・イメージのスタック・トレースをサポートしています。つまり、jdk.ObjectAllocationInNewTLAB
のフレームグラフの表示など、オブジェクト割当てが頻繁に発生する場所を診断するために関心のある操作を実行できます。
JFRイベント・ストリーミング
JFRイベント・ストリーミングは、ネイティブ・イメージで使用できます。イベント・ストリーミングを使用すると、アプリケーション・レベルで特定のイベントのコールバックを登録できます。これにより、記録の管理方法に対する柔軟性と制御性が向上します。たとえば、ストリーム内でイベントが特定の回数を超えて見つかった場合、イベントの期間しきい値を動的に増やすことができます。また、イベント・ストリーミングにより、アプリケーションは、モニタリングに役立つ継続的な定期JFR更新を取得できます。
現在、ストリームされたイベントではスタック・トレースを使用できません。つまり、コールバック・メソッド内のイベントのスタック・トレースにはアクセスできません。ただし、この制限はJFRスナップショット・ファイル(.jfr)のスタック・トレースには影響せず、それらは通常どおり動作します。
リモートJMXを介したFlightRecorderMXBeanとの対話
FlightRecorderMXBean
へのリモートJMX接続を介して、プロセス外からネイティブ・イメージJFRと対話できます。これは、JDK Mission ControlやVisualVMなどのアプリケーションを使用して実行できます。JMXを介して、FlightRecorderMXBean
APIをインタフェースとして使用して、JFR記録を開始、停止およびダンプできます。
ノート: リモートJMX接続のサポートは、ビルド時に個別に有効にする必要があり、試験的なものです。
FlightRecorderOptions
JFRパラメータを微調整するには、実行時に-XX:FlightRecorderOptions
を使用します。これは主に上級ユーザー向けであり、通常、ほとんどのユーザーはデフォルト・パラメータで問題ありません。
リーク・プロファイリング
jdk.OldObjectSample
イベントを使用して実装されたリーク・プロファイリングは、部分的に使用可能です。具体的には、古いオブジェクト・トラッキングは可能ですが、GCルート情報へのパスは使用できません。
組込みイベント
VMレベルの組込みイベントの多くは、ネイティブ・イメージで使用できます。HotSpot JVMのバイトコード・インストゥルメンテーションによって実装されたJavaレベルのイベントは、ネイティブ・イメージではまだ使用できません。このようなイベントには、ファイルI/Oおよび例外組込みイベントが含まれます。
次の表に、ネイティブ・イメージを使用して収集できるJFRイベントを示します。一部のイベントは、ネイティブ・イメージのデフォルトのガベージ・コレクタであるシリアルGCでのみ使用できます。
イベント名 |
---|
jdk.ActiveRecording |
jdk.ActiveSetting |
jdk.AllocationRequiringGC 1) |
jdk.ClassLoadingStatistics |
jdk.ContainerCPUThrottling |
jdk.ContainerCPUUsage |
jdk.ContainerConfiguration |
jdk.ContainerIOUsage |
jdk.ContainerMemoryUsage |
jdk.DataLoss |
jdk.ExecutionSample |
jdk.ExecuteVMOperation |
jdk.GarbageCollection 1) |
jdk.GCHeapSummary 1) |
jdk.GCPhasePause 1) |
jdk.GCPhasePauseLevel1 1) |
jdk.GCPhasePauseLevel2 1) |
jdk.GCPhasePauseLevel3 1) |
jdk.GCPhasePauseLevel4 1) |
jdk.InitialEnvironmentVariable |
jdk.InitialSystemProperty |
jdk.JavaMonitorEnter |
jdk.JavaMonitorInflate |
jdk.JavaMonitorWait |
jdk.JavaThreadStatistics |
jdk.JVMInformation |
jdk.ObjectAllocationSample 1) |
jdk.ObjectAllocationInNewTLAB 1) |
jdk.OldObjectSample 2) |
jdk.OSInformation |
jdk.PhysicalMemory |
jdk.SafepointBegin |
jdk.SafepointEnd |
jdk.SocketRead |
jdk.SocketWrite |
jdk.SystemGC 1) |
jdk.ThreadAllocationStatistics |
jdk.ThreadCPULoad |
jdk.ThreadEnd |
jdk.ThreadPark |
jdk.ThreadSleep |
jdk.ThreadStart |
jdk.VirtualThreadEnd |
jdk.VirtualThreadPinned |
jdk.VirtualThreadStart |
1) シリアルGCが使用されている場合に使用可能。
2) シリアルGCが使用されている場合に部分的に使用可能。