3.4. カスタムイベント API の定義と使用
JDK Flight Recorder (JFR) は、カスタムイベント API を含むイベントレコーダーです。jdk.jfr
モジュールに格納されているカスタムイベント API は、アプリケーションが JFR と通信できるようにするソフトウェアインターフェイスです。
JFR API には、Java アプリケーション、JVM、またはオペレーティングシステムの記録を管理し、カスタムイベントを作成するために使用できるクラスが含まれています。
カスタムイベント API を使用してイベントをモニターする前に、カスタムイベントタイプの名前とメタデータを定義する必要があります。
Event
クラスを拡張することにより、Duration
、Instant
、Requestable
、Time event
などの JFR ベースイベントを定義できます。具体的には、期間の値などのフィールドを、アプリケーションのペイロード属性で定義されたデータ型に一致するクラスに追加できます。Event
クラスを定義した後、イベントオブジェクトを作成できます。
この手順では、JFR および JDK Mission Control (JMC) でカスタムイベントタイプを使用して、単純なサンプルプログラムの実行時パフォーマンスを分析する方法を示します。
手順
カスタムイベントタイプの
Event
クラスで、@name
アノテーションを使用してカスタムイベントに名前を付けます。この名前は、JMC グラフィカルユーザーインターフェイス (GUI) に表示されます。Event
クラスでカスタムイベントタイプ名を定義する例@Name(“SampleCustomEvent”) public class SampleCustomEvent extends Event {...}
Event
クラスのメタデータと、名前、カテゴリー、ラベルなどの属性を定義します。ラベルには、JMC などのクライアントのイベントタイプが表示されます。注記大きな記録ファイルはパフォーマンスの問題を引き起こす可能性があり、これはファイルの操作方法に影響を与える可能性があります。必要なイベント記録アノテーションの数を正しく定義していることを確認してください。不要なアノテーションを定義すると、記録ファイルのサイズが大きくなる可能性があります。
サンプルの
Event
クラスのアノテーションを定義する例@Name(“SampleCustomEvent”) 1 @Label("Sample Custom Event") @Category("Sample events") @Description("Custom Event to demonstrate the Custom Events API") @StackTrace(false) 2 public class SampleCustomEvent extends Event { @Label("Method") 3 public String method; @Label("Generated Number") public int number; @Label("Size") @DataAmount 4 public int size; }
- 1
- JMC GUI でのカスタムイベントの表示方法のメタデータを定義する
@Name
などのアノテーションを記述します。 - 2
@StackTrace
アノテーションは、フライト記録のサイズを増やします。デフォルトでは、JFR にはイベントが作成された場所のstackTrace
は含まれていません。- 3
@Label
アノテーションは、HTTP リクエストのリソースメソッドなど、各メソッドのパラメーターを定義します。- 4
@DataAmount
アノテーションには、データ量をバイト単位で定義する属性が含まれています。JMC は、データ量をメガバイト (MB) などの他の単位で自動的にレンダリングします。
Event
クラスでコンテキスト情報を定義します。この情報は、カスタムイベントタイプの要求処理動作を設定するため、特定の JFR データを収集するようにイベントタイプを指定します。単純な
main
クラスとイベントループの定義例public class Main { private static int requestsSent; public static void main(String[] args) { // Register the custom event FlightRecorder.register(SampleCustomEvent.class); // Do some work to generate the events while (requestsSent <= 1000) { try { eventLoopBody(); Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } } private static void eventLoopBody() { // Create and begin the event SampleCustomEvent event = new SampleCustomEvent(); event.begin(); // Generate some data for the event Random r = new Random(); int someData = r.nextInt(1000000); // Set the event fields event.method = "eventLoopBody"; event.number = someData; event.size = 4; // End the event event.end(); event.commit(); requestsSent++; }
前の例では、単純な
main
クラスがイベントを登録し、イベントループがイベントフィールドにデータを入力してから、カスタムイベントを発生させます。JMC や JFR ツールなど、選択したアプリケーションのイベントタイプを調べます。
図3.2 JMC でイベントタイプを調べる例
JFR 記録には、さまざまなイベントタイプを含めることができます。アプリケーションで各イベントタイプを調べることができます。
関連情報
- JMC の詳細については、JDK Mission Control の紹介 を参照してください。