- 所有已实现的接口:
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();
}
- 自从:
- 14
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述void阻塞直到所有操作完成,或者流关闭,或者当前线程被中断,以先发生者为准。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()停止录制流。在类 java.lang.Object 中声明的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait在接口 jdk.jfr.consumer.EventStream 中声明的方法
onMetadata
-
构造方法详细信息
-
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- 包含要使用的设置的配置,而不是null- 抛出:
IllegalStateException- 如果无法创建飞行记录器(例如,如果 Java 虚拟机 (JVM) 缺少飞行记录器支持,或者无法创建或访问文件存储库)SecurityException- 如果使用安全管理器并且未设置 FlightRecorderPermission“accessFlightRecorder”。- 参见:
-
-
方法详情
-
enable
启用具有指定名称的事件。如果多个事件具有相同的名称(例如,相同的类在不同的类加载器中加载),则启用所有匹配该名称的事件。要启用特定类,请使用事件类型 ID 的
enable(Class)方法或String表示。- 参数:
name- 事件的设置,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null - 参见:
-
setSettings
替换此录制流的所有设置。以下示例使用“默认”配置记录 20 秒,然后将设置更改为“配置文件”配置。
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- 要设置的设置,而不是null- 参见:
-
enable
启用事件。- 参数:
eventClass- 要启用的事件,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null - 抛出:
IllegalArgumentException- 如果eventClass是抽象类或不是Event的子类
-
disable
禁用具有指定名称的事件。如果多个事件具有相同的名称(例如,同一个类在不同的类加载器中加载),则所有与该名称匹配的事件都将被禁用。要禁用特定类,请使用
disable(Class)方法或事件类型 ID 的String表示。- 参数:
name- 事件的设置,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null
-
disable
禁用事件。- 参数:
eventClass- 要启用的事件,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null - 抛出:
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)操作中的事件对象。如果 reuse 设置为
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- 事件的名称,而不是nullaction- 对每个与事件名称匹配的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- 写入记录数据的位置,而不是null- 抛出:
IOException- 如果无法将录制数据复制到指定位置,或者流已关闭或未启动。SecurityException- 如果存在安全管理器并且调用者没有FilePermission来写入目标路径- 自从:
- 17
- 参见:
-
awaitTermination
从接口EventStream复制的描述阻塞直到所有操作完成,或者流关闭,或者发生超时,或者当前线程被中断,以先发生者为准。- 指定者:
awaitTermination在接口EventStream中- 参数:
timeout- 最长时间等待,而不是null- 抛出:
InterruptedException- 如果在等待时被打断- 参见:
-
awaitTermination
从接口EventStream复制的描述阻塞直到所有操作完成,或者流关闭,或者当前线程被中断,以先发生者为准。- 指定者:
awaitTermination在接口EventStream中- 抛出:
InterruptedException- 如果在等待时被打断- 参见:
-