- 所有已实现的接口:
-
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
ConstructorDescription为当前JVM(Java虚拟机)创建事件流。RecordingStream
(Configuration configuration) 使用配置设置创建记录流。 -
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
-
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
- 在等待时被中断 - 参见:
-