ネイティブ・イメージでの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

記録を開始して実行時にロギングを構成するために、次のオプションがサポートされています:

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.jfcdefault.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

使用可能なログ・レベルは、trace、debug、info、warning、error、offです。

使用可能なログ・タグは、all、jfr、system、event、setting、bytecode、parser、metadata、dcmdです。

それ以外の場合、このオプションでは、タグの組合せのカンマ区切りリストが必要で、それぞれにオプションのワイルドカード(*)およびレベルがあります。

機能と制限

この項では、ネイティブ・イメージで使用可能な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が使用されている場合に部分的に使用可能。

その他の情報