18 プロセスにおけるイベント・ストリームの作成(アクティブ)

サンプルStreamEventsSample.javaでは、記録の作成と同時にイベント・ストリームが作成されます。イベント・ストリームとは、イベントのシーケンスです。

クラスRecordingStreamでは、記録が開始され、イベント・ストリームが同時に作成されます。サンプルでは、Thread.sleep(1000)が3回呼び出され、3つのjdk.ThreadSleepイベントが作成されます。jdk.ThreadSleepイベントが発生すると、イベント・ストリームAPIにより、このイベントが出力されます:

import jdk.jfr.Configuration;
import jdk.jfr.consumer.RecordingStream;

public class StreamEventsSample {

    public static void main(String... args) throws Exception {
        Configuration c = Configuration.getConfiguration("profile");
        try (RecordingStream rs = new RecordingStream(c)) {           
            rs.onEvent("jdk.ThreadSleep", System.out::println);
            System.out.println("Starting recording stream ...");
            rs.startAsync();            
            for (int i = 0; i < 3; i++) {
                System.out.println("Sleeping for 1s...");
                Thread.sleep(1000);
            }
        }
    }
}

次のコマンドを使用して、StreamEventsSampleを実行します:

java -XX:StartFlightRecording StreamEventsSample.java

次のような出力が表示されます:

Started recording 1. No limit specified, using maxsize=250MB as default.

Use jcmd 7400 JFR.dump name=1 filename=FILEPATH to copy recording data to file.
Starting recording stream ...
Sleeping for 1s...
Sleeping for 1s...
jdk.ThreadSleep {
  startTime = 00:26:42.463
  duration = 2.14 s
  time = 1.00 s
  ...
}

Sleeping for 1s...
jdk.ThreadSleep {
  startTime = 00:26:44.602
  duration = 1.04 s
  time = 1.00 s
  ...
}

RecordingStreamクラスを使用した記録からイベント・ストリームを作成するには、次のステップを実行します:

  1. オプションで、Configurationクラスを使用して、事前定義済の構成(defaultまたはprofile)を指定します。
  2. Configuration.getConfiguration()またはConfiguration.getConfiguration(Configuration)メソッドのいずれかを使用して、RecordingStreamインスタンスを作成します。
  3. オプションで、RecordingStream::enable(String)メソッドを使用して、イベント・ストリームに含めるイベントを有効化します。
  4. ストリーム内のイベントに実行するアクションを指定します。すべてのイベントに対して実行するアクションを指定するには、onEvent(Consumer<RecordedEvent>)メソッドを使用します。たとえば、次の文は、ストリーム内のすべてのイベント名を標準出力に出力します:

    rs.onEvent(e -> { System.out.println(e.getEventType().getName()); });
    特定のイベントに実行するアクションを指定するには、onEvent(String, Consumer<RecordedEvent>)を使用します。たとえば、次の文は、名前がjdk.ThreadSleepに一致するイベントを出力します:
    rs.onEvent("jdk.ThreadSleep", System.out::println);
  5. start()またはstartAsync()メソッドを使用してイベント・ストリームを開始します。このサンプルでは、バックグラウンド・スレッドでストリームを実行するstartAsync()が呼び出されます。start()メソッドを呼び出すと、アプリケーションでは、ストリームが閉じるまでこのメソッド呼出しは処理されません。