- 所有已实现的接口:
AutoCloseable,EventStream
EventStream 的实现可以使用 MBeanServerConnection 通过网络序列化事件。
以下示例显示了如何记录远程主机上的垃圾回收暂停和 CPU 使用率,并将事件打印到标准输出。
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (var rs = new RemoteRecordingStream(conn)) {
rs.enable("jdk.GCPhasePause").withoutThreshold();
rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
rs.onEvent("jdk.CPULoad", System.out::println);
rs.onEvent("jdk.GCPhasePause", System.out::println);
rs.start();
}
- 自从:
- 16
-
构造方法总结
构造方法构造方法描述RemoteRecordingStream(MBeanServerConnection connection) 创建针对已注册FlightRecorderMXBean的MBeanServerConnection进行操作的事件流。RemoteRecordingStream(MBeanServerConnection connection, Path directory) 创建针对已注册FlightRecorderMXBean的MBeanServerConnection进行操作的事件流。 -
方法总结
修饰符和类型方法描述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
-
构造方法详细信息
-
RemoteRecordingStream
- 参数:
connection-FlightRecorderMXBean注册的MBeanServerConnection,而不是null- 抛出:
IOException- 如果无法打开流,则在尝试访问存储库或FlightRecorderMXBean时发生 I/O 错误SecurityException- 如果安全管理器存在且其checkRead方法拒绝对目录或目录中文件的读取访问。
-
RemoteRecordingStream
- 参数:
connection-FlightRecorderMXBean注册的MBeanServerConnection,而不是nulldirectory- 用于存储下载的事件数据的目录,而不是null- 抛出:
IOException- 如果无法打开流,则在尝试访问存储库或FlightRecorderMXBean时发生 I/O 错误SecurityException- 如果安全管理器存在且其checkRead方法拒绝对目录或目录中文件的读取访问。
-
-
方法详情
-
setSettings
替换此录制流的所有设置。以下示例使用“默认”配置中的设置连接到远程主机和流事件。
{ String host = "com.example"; int port = 4711; String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"; JMXServiceURL u = new JMXServiceURL(url); JMXConnector c = JMXConnectorFactory.connect(u); MBeanServerConnection conn = c.getMBeanServerConnection(); try (final var rs = new RemoteRecordingStream(conn)) { rs.onMetadata(e -> { for (Configuration c : e.getConfigurations()) { if (c.getName().equals("default")) { rs.setSettings(c.getSettings()); } } }); rs.onEvent(System.out::println); rs.start(); }- 参数:
settings- 要设置的设置,而不是null- 参见:
-
disable
禁用具有指定名称的事件。如果多个事件具有相同的名称(例如,同一个类在不同的类加载器中加载),则所有与该名称匹配的事件都将被禁用。
- 参数:
name- 事件的设置,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null
-
enable
启用具有指定名称的事件。如果多个事件具有相同的名称(例如,相同的类在不同的类加载器中加载),则启用所有匹配该名称的事件。
- 参数:
name- 事件的设置,而不是null- 返回:
-
用于进一步配置的事件设置,而不是
null - 参见:
-
setMaxAge
确定为流保留多远的数据。要控制存储在磁盘上的记录数据量,可以指定保留数据的最大时间长度。 Java 虚拟机 (JVM) 删除存储在磁盘上超过指定时间长度的数据。
如果既没有设置最大限制也没有设置最大年龄,如果不使用事件,记录的大小可能会无限增长。
- 参数:
maxAge- 数据保存的时间长度,或者null如果无限- 抛出:
IllegalArgumentException- 如果maxAge为负IllegalStateException- 如果录音处于CLOSED状态
-
setMaxSize
public void setMaxSize(long maxSize) 确定为流保留多少数据。要控制存储在磁盘上的记录数据量,可以指定要保留的最大数据量。当超过最大限制时,Java 虚拟机 (JVM) 会删除最旧的块以为更新的块腾出空间。
如果既没有设置最大限制也没有设置最大年龄,如果不使用事件,记录的大小可能会无限增长。
大小以字节为单位。
- 参数:
maxSize- 要保留的数据量,0如果无限- 抛出:
IllegalArgumentException- 如果maxSize为负IllegalStateException- 如果录音处于CLOSED状态
-
onEvent
从接口EventStream复制的描述注册一个操作以对流中的所有事件执行。要对事件类型的子集执行操作,请考虑使用
EventStream.onEvent(String, Consumer)和EventStream.onMetadata(Consumer),因为它可能比通用操作中实现的任何选择或过滤机制更高效。- 指定者:
onEvent在接口EventStream中- 参数:
action- 对每个RecordedEvent执行的操作,而不是null- 参见:
-
onEvent
从接口EventStream复制的描述注册一个操作以对所有匹配名称的事件执行。- 指定者:
onEvent在接口EventStream中- 参数:
eventName- 事件的名称,而不是nullaction- 对每个与事件名称匹配的RecordedEvent执行的操作,而不是null
-
onFlush
从接口EventStream复制的描述注册在流被刷新后执行的操作。- 指定者:
onFlush在接口EventStream中- 参数:
action- 在刷新流后执行的操作,而不是null
-
onError
从接口EventStream复制的描述注册发生异常时要执行的操作。如果未注册操作,则会将异常堆栈跟踪打印到标准错误。
注册一个动作会重写默认行为。如果注册了多个动作,则按照注册的顺序执行。
如果此方法本身抛出异常,则结果行为是未定义的。
- 指定者:
onError在接口EventStream中- 参数:
action- 发生异常时要执行的操作,而不是null
-
onClose
从接口EventStream复制的描述注册在流关闭时要执行的操作。如果流已经关闭,则将在当前线程中立即执行操作。
- 指定者:
onClose在接口EventStream中- 参数:
action- 在流关闭后执行的操作,而不是null- 参见:
-
close
public void close()从接口EventStream复制的描述释放与此流关联的所有资源。如果一个流以异步或同步方式启动,它会立即停止或在下一次刷新后停止。此方法确实NOT保证所有已注册的操作在返回前完成。
关闭之前关闭的流没有任何效果。
- 指定者:
close在接口AutoCloseable中- 指定者:
close在接口EventStream中
-
remove
从接口EventStream复制的描述注销一个动作。如果动作已被注册多次,则所有实例都将被注销。
- 指定者:
remove在接口EventStream中- 参数:
action- 注销操作,而不是null- 返回:
true如果操作未注册,false否则- 参见:
-
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- 参见:
-
start
public void start()从接口EventStream复制的描述开始处理动作。操作在当前线程中执行。
要停止流,请使用
EventStream.close()方法。- 指定者:
start在接口EventStream中
-
startAsync
public void startAsync()从接口EventStream复制的描述开始异步处理动作。操作在一个单独的线程中执行。
要停止流,请使用
EventStream.close()方法。- 指定者:
startAsync在接口EventStream中
-
stop
public boolean stop()停止录制流。停止开始的流并等待记录中的所有事件都被消耗。
在操作中调用此方法,例如在
onEvent(Consumer)方法中,可能会无限期地阻止流。要突然停止流,请使用close()方法。以下代码片段说明了如何将此方法与
startAsync()方法结合使用来监视测试方法期间发生的情况:AtomicLong bytesWritten = new AtomicLong(); try (var r = new RemoteRecordingStream(connection)) { r.setMaxSize(Long.MAX_VALUE); r.enable("jdk.FileWrite").withoutThreshold(); r.onEvent(event -> bytesWritten.addAndGet(event.getLong("bytesWritten")) ); r.startAsync(); testFoo(); r.stop(); if (bytesWritten.get() > 1_000_000L) { r.dump(Path.of("file-write-events.jfr")); throw new AssertionError("testFoo() writes too much data to disk"); } }- 返回:
true如果录制停止,false否则- 抛出:
IllegalStateException- 如果录制未开始或已经停止- 自从:
- 20
-
dump
将录音数据写入文件。录制流必须开始,但不能关闭。
强烈建议在开始流之前设置最大年龄或最大大小。否则,转储可能不包含任何事件。
- 参数:
destination- 写入记录数据的位置,而不是null- 抛出:
IOException- 如果无法将录制数据复制到指定位置,或者流已关闭或未启动。SecurityException- 如果存在安全管理器并且调用者没有FilePermission来写入目标路径- 自从:
- 17
- 参见:
-
awaitTermination
从接口EventStream复制的描述阻塞直到所有操作完成,或者流关闭,或者发生超时,或者当前线程被中断,以先发生者为准。- 指定者:
awaitTermination在接口EventStream中- 参数:
timeout- 最长时间等待,而不是null- 抛出:
InterruptedException- 如果在等待时被打断- 参见:
-
awaitTermination
从接口EventStream复制的描述阻塞直到所有操作完成,或者流关闭,或者当前线程被中断,以先发生者为准。- 指定者:
awaitTermination在接口EventStream中- 抛出:
InterruptedException- 如果在等待时被打断- 参见:
-