Класс 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). |
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);
}
}
- Определено в:
-
onMetadataв интерфейсеEventStream - Параметры:
-
action— действие для выполнения; значение не должно бытьnull - Исключения:
-
IllegalStateException— если действие добавлено после запуска потока - Начиная с версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/jdk.jfr/jdk/jfr/consumer/RecordingStream.html