- 所有已实现的接口:
-
AutoCloseable
,EventStream
MBeanServerConnection
通过网络序列化事件的EventStream
的实现。
以下示例展示了如何在远程主机上记录垃圾回收暂停和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(); }
- 自 JDK 版本:
- 16
-
Constructor Summary
ConstructorDescriptionRemoteRecordingStream
(MBeanServerConnection connection) 创建一个针对已注册FlightRecorderMXBean
的MBeanServerConnection
操作的事件流。RemoteRecordingStream
(MBeanServerConnection connection, Path directory) 创建一个针对已注册FlightRecorderMXBean
的MBeanServerConnection
操作的事件流。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
阻塞,直到所有操作完成,或流关闭,或当前线程被中断,以先发生者为准。void
awaitTermination
(Duration timeout) 阻塞,直到所有操作完成,或流关闭,或超时发生,或当前线程被中断,以先发生者为准。void
close()
释放与此流关联的所有资源。禁用指定名称的事件。void
将记录数据写入文件。启用指定名称的事件。void
注册在流关闭时执行的操作。void
注册在发生异常时执行的操作。void
onEvent
(String eventName, Consumer<RecordedEvent> action) 注册在所有匹配名称的事件上执行的操作。void
onEvent
(Consumer<RecordedEvent> action) 注册在流中的所有事件上执行的操作。void
注册在流刷新后执行的操作。boolean
注销一个操作。void
setEndTime
(Instant endTime) 指定流的结束时间。void
确定流保留数据的时间跨度。void
setMaxSize
(long maxSize) 确定流保留的数据量。void
setOrdered
(boolean ordered) 指定事件按照它们提交到流中的时间按顺序到达。void
setReuse
(boolean reuse) 指定在EventStream.onEvent(Consumer)
操作中事件对象可以被重用。void
setSettings
(Map<String, String> settings) 替换此记录流的所有设置。void
setStartTime
(Instant startTime) 指定流的开始时间。void
start()
开始处理操作。void
开始异步处理操作。boolean
stop()
停止记录流。Methods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods declared in interface jdk.jfr.consumer.EventStream
onMetadata
-
Constructor Details
-
RemoteRecordingStream
- 参数:
-
connection
- 已注册FlightRecorderMXBean
的MBeanServerConnection
,不能为空 - 抛出:
-
IOException
- 如果无法打开流,尝试访问存储库或FlightRecorderMXBean
时发生I/O错误 -
SecurityException
- 如果存在安全管理器且其checkRead
方法拒绝对目录或目录中的文件的读取访问
-
RemoteRecordingStream
- 参数:
-
connection
- 已注册FlightRecorderMXBean
的MBeanServerConnection
,不能为空 -
directory
- 存储下载的事件数据的目录,不能为空 - 抛出:
-
IOException
- 如果无法打开流,尝试访问存储库或FlightRecorderMXBean
时发生I/O错误 -
SecurityException
- 如果存在安全管理器且其checkRead
方法拒绝对目录或目录中的文件的读取访问
-
-
Method Details
-
setSettings
替换此记录流的所有设置。以下示例连接到远程主机,并使用来自“default”配置的设置流事件。
{ 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
- 要设置的设置,不能为空 - 参见:
-
disable
禁用指定名称的事件。如果多个具有相同名称的事件(例如,相同类在不同的类加载器中加载),则禁用所有匹配名称的事件。
- 参数:
-
name
- 事件的设置,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
-
enable
启用指定名称的事件。如果多个具有相同名称的事件(例如,相同类在不同的类加载器中加载),则启用所有匹配名称的事件。
- 参数:
-
name
- 事件的设置,不能为空 - 返回:
- 用于进一步配置的事件设置,不能为空
- 参见:
-
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
上执行的操作,不能为空 - 参见:
-
onEvent
从接口中复制的描述:EventStream
注册一个在所有匹配名称的事件上执行的操作。- 指定者:
-
onEvent
在接口EventStream
中 - 参数:
-
eventName
- 事件的名称,不能为空 -
action
- 在匹配事件名称的每个RecordedEvent
上执行的操作,不能为空
-
onFlush
从接口中复制的描述:EventStream
注册一个在流刷新后执行的操作。- 指定者:
-
onFlush
在接口EventStream
中 - 参数:
-
action
- 在流刷新后执行的操作,不能为空
-
onError
从接口中复制的描述:EventStream
注册一个在发生异常时执行的操作。如果未注册操作,则异常堆栈跟踪将打印到标准错误输出。
注册操作会覆盖默认行为。如果已注册多个操作,则按注册顺序执行它们。
如果此方法本身引发异常,则结果行为是未定义的。
- 指定者:
-
onError
在接口EventStream
中 - 参数:
-
action
- 如果发生异常时执行的操作,不能为空
-
onClose
从接口中复制的描述:EventStream
注册一个在流关闭时执行的操作。如果流已关闭,则操作将立即在当前线程中执行。
- 指定者:
-
onClose
在接口EventStream
中 - 参数:
-
action
- 在流关闭后执行的操作,不能为空 - 参见:
-
close
public void close()从接口中复制的描述:EventStream
释放与此流关联的所有资源。如果流已启动(异步或同步),则立即停止或在下一次刷新后停止。此方法不保证在返回之前完成所有已注册的操作。
关闭先前关闭的流不会产生任何效果。
- 指定者:
-
close
在接口AutoCloseable
中 - 指定者:
-
close
在接口EventStream
中
-
remove
从接口中复制的描述:EventStream
注销一个操作。如果操作已注册多次,则所有实例都将被注销。
- 指定者:
-
remove
在接口EventStream
中 - 参数:
-
action
- 要注销的操作,不能为空 - 返回:
-
true
如果操作已注销,否则false
- 参见:
-
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
- 开始时间,不能为空 - 参见:
-
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
如果停止记录,则为true
,否则为false
- 抛出:
-
IllegalStateException
- 如果记录未启动或已停止 - 自:
- 20
-
dump
将记录数据写入文件。记录流必须已启动,但未关闭。
强烈建议在启动流之前设置最大年龄或最大大小。否则,转储可能不包含任何事件。
- 参数:
-
destination
- 写入记录数据的位置,非null
- 抛出:
-
IOException
- 如果无法将记录数据复制到指定位置,或者流已关闭或未启动 -
SecurityException
- 如果存在安全管理器且调用者没有写入目标路径的FilePermission
- 自:
- 17
- 参见:
-
awaitTermination
从接口复制的描述:EventStream
阻塞,直到所有操作完成,或流关闭,或超时发生,或当前线程被中断,以先发生的为准。- 指定者:
-
awaitTermination
在接口EventStream
- 参数:
-
timeout
- 最大等待时间,非null
- 抛出:
-
InterruptedException
- 在等待时被中断 - 参见:
-
awaitTermination
从接口复制的描述:EventStream
阻塞,直到所有操作完成,或流关闭,或当前线程被中断,以先发生的为准。- 指定者:
-
awaitTermination
在接口EventStream
- 抛出:
-
InterruptedException
- 在等待时被中断 - 参见:
-