- 所有已实现的接口:
-
AutoCloseable,EventStream
以下示例显示如何使用默认配置记录事件,并将垃圾回收、CPU负载和JVM信息事件打印到标准输出。
Configuration c = Configuration.getConfiguration("default");
try (var rs = new RecordingStream(c)) {
rs.onEvent("jdk.GarbageCollection", System.out::println);
rs.onEvent("jdk.CPULoad", System.out::println);
rs.onEvent("jdk.JVMInformation", System.out::println);
rs.start();
}
- 自 JDK 版本:
- 14
-
Constructor Summary
ConstructorsConstructorDescription为当前JVM(Java虚拟机)创建事件流。RecordingStream(Configuration configuration) 使用配置设置创建记录流。 -
Method Summary
Modifier and TypeMethodDescriptionvoid阻塞,直到所有操作完成,或流关闭,或当前线程被中断,以先发生者为准。voidawaitTermination(Duration timeout) 阻塞,直到所有操作完成,或流关闭,或超时发生,或当前线程被中断,以先发生者为准。voidclose()关闭此资源,放弃任何底层资源。禁用事件。禁用指定名称的事件。void将记录数据写入文件。启用事件。启用指定名称的事件。void注册在流关闭时执行的操作。void注册在发生异常时执行的操作。voidonEvent(String eventName, Consumer<RecordedEvent> action) 注册在所有匹配名称的事件上执行的操作。voidonEvent(Consumer<RecordedEvent> action) 注册在流中的所有事件上执行的操作。void注册在流刷新后执行的操作。boolean注销操作。voidsetEndTime(Instant endTime) 指定流的结束时间。void确定流保留数据的时间跨度。voidsetMaxSize(long maxSize) 确定流保留的数据量。voidsetOrdered(boolean ordered) 指定事件按时间顺序到达,按提交到流的时间排序。voidsetReuse(boolean reuse) 指定在EventStream.onEvent(Consumer)操作中事件对象可以被重用。voidsetSettings(Map<String, String> settings) 替换此记录流的所有设置。voidsetStartTime(Instant startTime) 指定流的开始时间。voidstart()开始处理操作。void开始异步处理操作。booleanstop()停止记录流。Methods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods declared in interface jdk.jfr.consumer.EventStream
onMetadata
-
Constructor Details
-
RecordingStream
public RecordingStream()为当前JVM(Java虚拟机)创建事件流。- 抛出:
-
IllegalStateException- 如果无法创建飞行记录器(例如,如果Java虚拟机(JVM)缺少飞行记录器支持,或者无法创建或访问文件存储库) -
SecurityException- 如果存在安全管理器且调用方没有FlightRecorderPermission("accessFlightRecorder")
-
RecordingStream
使用配置设置创建记录流。以下示例显示如何创建使用预定义配置的记录流。
var c = Configuration.getConfiguration("default"); try (var rs = new RecordingStream(c)) { rs.onEvent(System.out::println); rs.start(); }- 参数:
-
configuration- 包含要使用的设置的配置,不能为空 - 抛出:
-
IllegalStateException- 如果无法创建飞行记录器(例如,如果Java虚拟机(JVM)缺少飞行记录器支持,或者无法创建或访问文件存储库) -
SecurityException- 如果使用了安全管理器且未设置FlightRecorderPermission("accessFlightRecorder") - 参见:
-
-
Method Details
-
enable
启用指定名称的事件。如果多个事件具有相同名称(例如,相同类在不同类加载器中加载),则启用与名称匹配的所有事件。要启用特定类,请使用
enable(Class)方法或事件类型ID的String表示。- 参数:
-
name- 事件的设置,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
- 参见:
-
setSettings
替换此记录流的所有设置。以下示例使用“default”配置记录20秒,然后将设置更改为“profile”配置。
Configuration defaultConfiguration = Configuration.getConfiguration("default"); Configuration profileConfiguration = Configuration.getConfiguration("profile"); try (var rs = new RecordingStream(defaultConfiguration)) { rs.onEvent(System.out::println); rs.startAsync(); Thread.sleep(20_000); rs.setSettings(profileConfiguration.getSettings()); Thread.sleep(20_000); }- 参数:
-
settings- 要设置的设置,不能为空 - 参见:
-
enable
启用事件。- 参数:
-
eventClass- 要启用的事件,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
- 抛出:
-
IllegalArgumentException- 如果eventClass是抽象类或不是Event的子类
-
disable
禁用指定名称的事件。如果多个具有相同名称的事件(例如,相同类在不同类加载器中加载),则禁用与名称匹配的所有事件。要禁用特定类,请使用
disable(Class)方法或事件类型ID的String表示。- 参数:
-
name- 事件的设置,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
-
disable
禁用事件。- 参数:
-
eventClass- 要启用的事件,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
- 抛出:
-
IllegalArgumentException- 如果eventClass是抽象类或不是Event的子类
-
setMaxAge
确定流保留数据的时间跨度。为了控制存储在磁盘上的记录数据量,可以指定保留数据的最长时间。如果存储在磁盘上的数据超过指定的时间长度,则Java虚拟机(JVM)会删除旧数据。
如果未设置最大限制或最大年龄,则如果事件开启,记录的大小可能会无限增长。
- 参数:
-
maxAge- 保留数据的时间长度,如果无限则为null - 抛出:
-
IllegalArgumentException- 如果maxAge为负数 -
IllegalStateException- 如果记录处于CLOSED状态
-
setMaxSize
public void setMaxSize(long maxSize) 确定流保留的数据量。为了控制存储在磁盘上的记录数据量,可以指定要保留的最大数据量。当超过最大限制时,Java虚拟机(JVM)会删除最旧的块以为更近的块腾出空间。
如果未设置最大限制或最大年龄,则如果事件开启,记录的大小可能会无限增长。
大小以字节为单位。
- 参数:
-
maxSize- 要保留的数据量,如果无限则为0 - 抛出:
-
IllegalArgumentException- 如果maxSize为负数 -
IllegalStateException- 如果记录处于CLOSED状态
-
setReuse
public void setReuse(boolean reuse) 从接口复制的描述:EventStream指定在EventStream.onEvent(Consumer)操作中事件对象可以被重用。如果重用设置为
true,则操作完成后不应保留对事件对象的引用。- 指定者:
-
setReuse在接口EventStream - 参数:
-
reuse- 如果事件对象可以被重用,则为true,否则为false
-
setOrdered
public void setOrdered(boolean ordered) 从接口复制的描述:EventStream指定事件按照它们提交到流中的时间顺序以时间顺序到达。- 指定者:
-
setOrdered在接口EventStream - 参数:
-
ordered- 如果事件对象按照时间顺序到达EventStream.onEvent(Consumer)
-
setStartTime
从接口复制的描述:EventStream指定流的开始时间。在启动流之前必须设置开始时间。
- 指定者:
-
setStartTime在接口EventStream - 参数:
-
startTime- 开始时间,非null - 参见:
-
setEndTime
从接口复制的描述:EventStream指定流的结束时间。在启动流之前必须设置结束时间。
在结束时间时,流将被关闭。
- 指定者:
-
setEndTime在接口EventStream - 参数:
-
endTime- 结束时间,非null - 参见:
-
onEvent
从接口复制的描述:EventStream注册一个操作以在所有匹配名称的事件上执行。- 指定者:
-
onEvent在接口EventStream - 参数:
-
eventName- 事件名称,非null -
action- 在每个匹配事件名称的RecordedEvent上执行的操作,非null
-
onEvent
从接口复制的描述:EventStream注册一个操作以在流中的所有事件上执行。要在事件类型的子集上执行操作,请考虑使用
EventStream.onEvent(String, Consumer)和EventStream.onMetadata(Consumer),因为这可能比在通用操作中实现的任何选择或过滤机制更高效。- 指定者:
-
onEvent在接口EventStream - 参数:
-
action- 在每个RecordedEvent上执行的操作,非null - 参见:
-
onFlush
从接口复制的描述:EventStream注册一个操作以在流刷新后执行。- 指定者:
-
onFlush在接口EventStream - 参数:
-
action- 在流刷新后执行的操作,非null
-
onClose
从接口复制的描述:EventStream注册一个操作以在流关闭时执行。如果流已关闭,则操作将立即在当前线程中执行。
- 指定者:
-
onClose在接口EventStream - 参数:
-
action- 在流关闭后执行的操作,非null - 参见:
-
onError
从接口复制的描述:EventStream注册一个操作以在发生异常时执行。如果未注册操作,则异常堆栈跟踪将打印到标准错误输出。
注册操作会覆盖默认行为。如果已注册多个操作,则按注册顺序执行它们。
如果此方法本身引发异常,则结果行为是未定义的。
- 指定者:
-
onError在接口EventStream - 参数:
-
action- 如果发生异常时执行的操作,非null
-
close
public void close()从接口复制的描述:AutoCloseable关闭此资源,放弃任何底层资源。此方法会自动在由try-with-resources 语句管理的对象上调用。- 指定者:
-
close在接口AutoCloseable - 指定者:
-
close在接口EventStream
-
remove
从接口复制的描述:EventStream注销一个操作。如果操作已注册多次,则所有实例都将被注销。
- 指定者:
-
remove在接口EventStream - 参数:
-
action- 要注销的操作,非null - 返回:
-
true如果操作已注销,否则为false - 参见:
-
start
public void start()从接口复制的描述:EventStream开始处理操作。操作在当前线程中执行。
要停止流,请使用
EventStream.close()方法。- 指定者:
-
start在接口EventStream
-
startAsync
public void startAsync()开始异步处理操作。操作在单独的线程中执行。
要停止流,请使用
close()方法。以下示例打印CPU使用率十秒钟。当当前线程离开try-with-resources块时,流将被停止/关闭。
try (var stream = new RecordingStream()) { stream.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1)); stream.onEvent("jdk.CPULoad", event -> { System.out.println(event); }); stream.startAsync(); Thread.sleep(10_000); }- 指定者:
-
startAsync在接口EventStream - 抛出:
-
IllegalStateException- 如果流已经启动或关闭
-
stop
public boolean stop()停止记录流。停止已启动的流,并等待记录中的所有事件被消耗。
在操作中调用此方法,例如在
onEvent(Consumer)方法中,可能会无限期地阻塞流。要突然停止流,请使用close()方法。以下代码片段说明了如何将此方法与
startAsync()方法结合使用以监视测试方法期间发生的情况:AtomicBoolean socketUse = new AtomicBoolean(); try (var r = new RecordingStream()) { r.setMaxSize(Long.MAX_VALUE); r.enable("jdk.SocketWrite").withoutThreshold(); r.enable("jdk.SocketRead").withoutThreshold(); r.onEvent(event -> socketUse.set(true)); r.startAsync(); testFoo(); r.stop(); if (socketUse.get()) { r.dump(Path.of("socket-events.jfr")); throw new AssertionError("testFoo() should not use network"); } }- 返回:
-
true如果记录已停止,否则false - 抛出:
-
IllegalStateException- 如果记录未启动或已停止 - 自:
- 20
-
dump
将记录数据写入文件。记录流必须已启动,但未关闭。
强烈建议在启动流之前设置最大年龄或最大大小。否则,转储可能不包含任何事件。
- 参数:
-
destination- 写入记录数据的位置,不能为空 - 抛出:
-
IOException- 如果无法将记录数据复制到指定位置,或者流已关闭或未启动 -
SecurityException- 如果存在安全管理器且调用者没有写入目标路径的FilePermission - 自:
- 17
- 参见:
-
awaitTermination
从接口复制的描述:EventStream阻塞,直到所有操作完成,或流关闭,或超时发生,或当前线程被中断,以先发生者为准。- 指定者:
-
awaitTermination在接口EventStream - 参数:
-
timeout- 等待的最长时间,不能为空 - 抛出:
-
InterruptedException- 在等待时被中断 - 参见:
-
awaitTermination
从接口复制的描述:EventStream阻塞,直到所有操作完成,或流关闭,或当前线程被中断,以先发生者为准。- 指定者:
-
awaitTermination在接口EventStream - 抛出:
-
InterruptedException- 在等待时被中断 - 参见:
-