Класс RecordingStream
- Все реализованные интерфейсы:
-
AutoCloseable,EventStream
public final class RecordingStream extends Object implements AutoCloseable, EventStream
Следующий пример демонстрирует, как записывать события с использованием стандартной конфигурации и выводить события Garbage Collection, CPU Load и JVM Information в стандартный вывод.
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
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
RecordingStream() |
Создаёт поток событий для текущей JVM (Java Virtual Machine). |
RecordingStream |
Создаёт поток записи, используя настройки из конфигурации. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
awaitTermination() |
Ожидает завершения всех действий, закрытия потока или прерывания текущей нити, в зависимости от того, что произойдёт раньше. |
void |
awaitTermination |
Ожидает завершения всех действий, закрытия потока, истечения таймаута или прерывания текущей нити, в зависимости от того, что произойдёт раньше. |
void |
close() |
Закрывает этот ресурс, высвобождая все связанные ресурсы. |
EventSettings |
disable |
Отключает событие. |
EventSettings |
disable |
Отключает событие с указанным именем. |
void |
dump |
Записывает данные записи в файл. |
EventSettings |
enable |
Включает событие. |
EventSettings |
enable |
Включает событие с указанным именем. |
void |
onClose |
Регистрирует действие, которое должно выполняться при закрытии потока. |
void |
onError |
Регистрирует действие, которое должно выполняться, если произойдёт исключение. |
void |
onEvent |
Регистрирует действие, которое должно выполняться для всех событий, соответствующих имени. |
void |
onEvent |
Регистрирует действие, которое должно выполняться для всех событий в потоке. |
void |
onFlush |
Регистрирует действие, которое должно выполняться после того, как поток будет сброшен. |
void |
onMetadata |
Регистрирует действие, которое должно выполняться, когда в поток приходят новые метаданные. |
boolean |
remove |
Отменяет регистрацию действия. |
void |
setEndTime |
Устанавливает конечное время потока. |
void |
setMaxAge |
Определяет, насколько долго данные сохраняются для потока. |
void |
setMaxSize |
Определяет, сколько данных хранится для потока. |
void |
setOrdered |
Указывает, что события поступают в хронологическом порядке, отсортированном по времени их записи в поток. |
void |
setReuse |
Указывает, что объект события в действии EventStream.onEvent(Consumer) может быть повторно использован. |
void |
setSettings |
Заменяет все настройки для этого потока записи. |
void |
setStartTime |
Устанавливает начальное время потока. |
void |
start() |
Запускает обработку действий. |
void |
startAsync() |
Запускает асинхронную обработку действий. |
boolean |
stop() |
Останавливает поток записи. |
Подробное описание конструкторов
RecordingStream
public RecordingStream()
- Возбуждает:
-
IllegalStateException- если Flight Recorder не может быть создан (например, если в виртуальной машине Java (JVM) отсутствует поддержка Flight Recorder или если репозиторий файлов не может быть создан или доступен)
RecordingStream
public RecordingStream(Configuration configuration)
Следующий пример показывает, как создать поток записи, использующий предопределённую конфигурацию.
var c = Configuration.getConfiguration("default");
try (var rs = new RecordingStream(c)) {
rs.onEvent(System.out::println);
rs.start();
}
- Параметры:
-
configuration- конфигурация, содержащая используемые настройки, неnull - Возбуждает:
-
IllegalStateException- если Flight Recorder не может быть создан (например, если в виртуальной машине Java (JVM) отсутствует поддержка Flight Recorder или если репозиторий файлов не может быть создан или доступен) - См. также:
Подробное описание методов
enable
public EventSettings enable(String name)
Если несколько событий имеют одинаковое имя (например, один и тот же класс загружен в разных загрузчиках классов), то все события, соответствующие имени, включаются. Для включения конкретного класса используйте метод enable(Class) или String представление идентификатора типа события.
- Параметры:
-
name- настройки для события, неnull - Возвращает:
- настройку события для дальнейшей конфигурации, не
null - См. также:
setSettings
public void setSettings(Map<String,String> settings)
Следующий пример записывает 20 секунд, используя конфигурацию "default", а затем изменяет настройки на конфигурацию "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- настройки для установки, неnull - См. также:
enable
public EventSettings enable(Class<? extends Event> eventClass)
- Параметры:
-
eventClass- событие для включения, неnull - Возвращает:
- настройку события для дальнейшей конфигурации, не
null - Возбуждает:
-
IllegalArgumentException- еслиeventClassявляется абстрактным классом или не является подклассомEvent
disable
public EventSettings disable(String name)
Если несколько событий имеют одинаковое имя (например, один и тот же класс загружен в разных загрузчиках классов), то все события, соответствующие имени, отключаются. Для отключения конкретного класса используйте метод disable(Class) или String представление идентификатора типа события.
- Параметры:
-
name- настройки для события, неnull - Возвращает:
- настройку события для дальнейшей конфигурации, не
null
disable
public EventSettings disable(Class<? extends Event> eventClass)
- Параметры:
-
eventClass- событие для отключения, неnull - Возвращает:
- настройку события для дальнейшей конфигурации, не
null - Возбуждает:
-
IllegalArgumentException- еслиeventClassявляется абстрактным классом или не является подклассомEvent
setMaxAge
public void setMaxAge(Duration maxAge)
Для управления объёмом данных записи, хранящихся на диске, можно указать максимальную длительность сохранения данных. Данные, хранящиеся на диске, которые старше указанной длительности времени, удаляются виртуальной машиной 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)
EventStreamEventStream.onEvent(Consumer) может быть повторно использован. Если повторное использование установлено в true, действие не должно хранить ссылку на объект события после завершения действия.
- Указано в:
-
setReuseв интерфейсеEventStream - Параметры:
-
reuse-trueесли объект события может быть повторно использован,falseв противном случае
setOrdered
public void setOrdered(boolean ordered)
EventStream- Указано в:
-
setOrderedв интерфейсеEventStream - Параметры:
-
ordered- если объекты событий приходят в хронологическом порядке вEventStream.onEvent(Consumer)
setStartTime
public void setStartTime(Instant startTime)
EventStreamВремя начала должно быть установлено до запуска потока
- Указано в:
-
setStartTimeв интерфейсеEventStream - Параметры:
-
startTime- начальное время, неnull - См. также:
setEndTime
public void setEndTime(Instant endTime)
EventStreamВремя окончания должно быть установлено до запуска потока.
В момент окончания время поток закрывается.
- Указано в:
-
setEndTimeв интерфейсеEventStream - Параметры:
-
endTime- конечное время, неnull - См. также:
onEvent
public void onEvent(String eventName, Consumer<RecordedEvent> action)
EventStream- Указано в:
-
onEventв интерфейсеEventStream - Параметры:
-
eventName- имя события, неnull -
action- действие для выполнения для каждогоRecordedEvent, соответствующего имени события, неnull
onEvent
public void onEvent(Consumer<RecordedEvent> action)
EventStream Для выполнения действия на подмножестве типов событий, рассмотрите использование EventStream.onEvent(String, Consumer) и EventStream.onMetadata(Consumer), так как это, вероятно, более производительно, чем любой механизм выбора или фильтрации, реализованный в общем действии.
- Указано в:
-
onEventв интерфейсеEventStream - Параметры:
-
action- действие для выполнения для каждогоRecordedEvent, неnull - См. также:
onFlush
public void onFlush(Runnable action)
EventStream- Указано в:
-
onFlushв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после сброса потока, неnull
onClose
public void onClose(Runnable action)
EventStreamЕсли поток уже закрыт, действие будет выполнено немедленно в текущей потоковой нити.
- Указано в:
-
onCloseв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после закрытия потока, неnull - См. также:
onError
public void onError(Consumer<Throwable> action)
EventStreamЕсли действие не зарегистрировано, трассировка стека исключения будет выведена в стандартный поток ошибок.
Регистрация действия переопределяет стандартное поведение. Если несколько действий зарегистрированы, они выполняются в порядке регистрации.
Если само этот метод бросит исключение, результирующее поведение не определено.
- Указано в:
-
onErrorв интерфейсеEventStream - Параметры:
-
action- действие для выполнения, если произойдёт исключение, неnull
close
public void close()
AutoCloseabletry-с-ресурсами.- Указано в:
-
closeв интерфейсеAutoCloseable - Указано в:
-
closeв интерфейсеEventStream
remove
public boolean remove(Object action)
EventStreamЕсли действие зарегистрировано несколько раз, все экземпляры отменяются.
- Указано в:
-
removeв интерфейсеEventStream - Параметры:
-
action- действие для отмены регистрации, неnull - Возвращает:
-
true, если действие было отменено,falseв противном случае - См. также:
start
public void start()
EventStreamДействия выполняются в текущей потоковой нити.
Для остановки потока используйте метод EventStream.close().
- Указано в:
-
startв интерфейсеEventStream
startAsync
public void startAsync()
Действия выполняются в отдельной потоковой нити.
Для остановки потока используйте метод close().
Следующий пример выводит использование ЦП в течение десяти секунд. Когда текущая потоковая нить покидает блок 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
public void dump(Path destination) throws IOException
Поток записи должен быть запущен, но не закрыт.
Сильно рекомендуется установить максимальный срок действия или максимальный размер до запуска потока. В противном случае дамп может не содержать никаких событий.
- Параметры:
-
destination- местоположение, куда записываются данные записи, неnull - Исключения:
-
IOException- если данные записи не могут быть скопированы в указанное местоположение, или если поток закрыт, или не запущен. - С момента:
- 17
- См. также:
awaitTermination
public void awaitTermination(Duration timeout) throws InterruptedException
EventStream- Указано в:
-
awaitTerminationв интерфейсеEventStream - Параметры:
-
timeout- максимальное время ожидания, неnull - Исключения:
-
InterruptedException- если прервано ожидание - См. также:
awaitTermination
public void awaitTermination() throws InterruptedException
EventStream- Указано в:
-
awaitTerminationв интерфейсеEventStream - Исключения:
-
InterruptedException- если прервано ожидание - См. также:
onMetadata
public void onMetadata(Consumer<MetadataEvent> action)
Следующий пример демонстрирует, как прослушивать новые типы событий, регистрировать действие, если имя типа события соответствует регулярному выражению, и увеличивать счётчик, если найдено соответствующее событие. Преимущество использования действия для каждого типа события вместо универсального метода onEvent(Consumer) заключается в том, что реализация потока может избегать чтения событий, которые не представляют интереса.
static long count = 0;
public static void main(String... args) throws Exception {
String regExp = args[0];
var pr = Pattern.compile(regExp).asMatchPredicate();
Configuration c = Configuration.getConfiguration("default");
try (var s = new RecordingStream(c)) {
s.setOrdered(false);
s.onMetadata(metadata -> metadata.getAddedEventTypes()
.stream().map(EventType::getName).filter(pr)
.forEach(eventName -> s.onEvent(eventName, event -> count++)));
s.startAsync();
System.out.println("Running recording for 5 s. Please wait.");
s.awaitTermination(Duration.ofSeconds(5));
System.out.println(count + " events matches " + regExp);
}
}
- Specified by:
-
onMetadataв интерфейсеEventStream - Parameters:
-
action- для выполнения, неnull - Throws:
-
IllegalStateException- если действие добавлено после запуска потока - Since:
- 16
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/jdk.jfr/jdk/jfr/consumer/RecordingStream.html