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クラスを使用した記録からイベント・ストリームを作成するには、次のステップを実行します:
- オプションで、Configurationクラスを使用して、事前定義済の構成(defaultまたはprofile)を指定します。
- Configuration.getConfiguration()またはConfiguration.getConfiguration(Configuration)メソッドのいずれかを使用して、RecordingStreamインスタンスを作成します。
- オプションで、
RecordingStream::enable(String)
メソッドを使用して、イベント・ストリームに含めるイベントを有効化します。 -
ストリーム内のイベントに実行するアクションを指定します。すべてのイベントに対して実行するアクションを指定するには、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);
- start()またはstartAsync()メソッドを使用してイベント・ストリームを開始します。このサンプルでは、バックグラウンド・スレッドでストリームを実行するstartAsync()が呼び出されます。start()メソッドを呼び出すと、アプリケーションでは、ストリームが閉じるまでこのメソッド呼出しは処理されません。