Spec-Zone.ru › OpenJDK 25

Класс RecordingStream

java.lang.Object
jdk.jfr.consumer.RecordingStream
Все реализуемые интерфейсы:
AutoCloseable, EventStream
public final class RecordingStream extends Object implements AutoCloseable, EventStream
Поток записи создает события из текущей JVM (виртуальной машины Java).

В следующем примере показано, как записывать события с помощью конфигурации по умолчанию и выводить события 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(Configuration configuration)
Создает поток записи с использованием параметров конфигурации.

Краткое описание методов

Модификатор и тип Метод Описание
void awaitTermination()
Блокирует выполнение до завершения всех действий, закрытия потока, прерывания текущего потока или наступления тайм-аута — в зависимости от того, что произойдет первым.
void awaitTermination(Duration timeout)
Блокирует выполнение до завершения всех действий, закрытия потока, наступления тайм-аута или прерывания текущего потока — в зависимости от того, что произойдет первым.
void close()
Закрывает этот ресурс и освобождает все связанные с ним ресурсы.
EventSettings disable(Class<? extends Event> eventClass)
Отключает событие.
EventSettings disable(String name)
Отключает событие с указанным именем.
void dump(Path destination)
Записывает данные записи в файл.
EventSettings enable(Class<? extends Event> eventClass)
Включает событие.
EventSettings enable(String name)
Включает событие с указанным именем.
void onClose(Runnable action)
Регистрирует действие, выполняемое при закрытии потока.
void onError(Consumer<Throwable> action)
Регистрирует действие, выполняемое при возникновении исключения.
void onEvent(String eventName, Consumer<RecordedEvent> action)
Регистрирует действие, выполняемое для всех событий, соответствующих имени.
void onEvent(Consumer<RecordedEvent> action)
Регистрирует действие, выполняемое для всех событий в потоке.
void onFlush(Runnable action)
Регистрирует действие, выполняемое после сброса потока.
void onMetadata(Consumer<MetadataEvent> action)
Регистрирует действие, выполняемое при поступлении новых метаданных в поток.
boolean remove(Object action)
Отменяет регистрацию действия.
void setEndTime(Instant endTime)
Задает время окончания потока.
void setMaxAge(Duration maxAge)
Определяет, за какой период сохраняются данные потока.
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 startAsync()
Запускает асинхронную обработку действий.
boolean stop()
Останавливает поток записи.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

RecordingStream

public RecordingStream()
Создает поток событий для текущей JVM (виртуальной машины Java).
Исключения:
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 или если не удается создать репозиторий файлов либо получить к нему доступ)
См. также:
  • Configuration

Подробное описание методов

enable

public EventSettings enable(String name)
Включает событие с указанным именем.

Если несколько событий имеют одинаковое имя (например, один и тот же класс загружен разными загрузчиками классов), включаются все события, соответствующие этому имени. Чтобы включить конкретный класс, используйте метод enable(Class) или String представление идентификатора типа события.

Параметры:
name — параметры события; значение не должно быть null
Возвращает:
параметр события для дальнейшей настройки; значение не должно быть null
См. также:
  • EventType

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
См. также:
  • Recording.setSettings(Map)

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)
Описание скопировано из интерфейса: EventStream
Задает возможность повторного использования объекта события в действии EventStream.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
См. также:
  • EventStream.start()
  • EventStream.startAsync()

setEndTime

public void setEndTime(Instant endTime)
Описание скопировано из интерфейса: EventStream
Задает время окончания потока.

Время окончания необходимо задать до запуска потока.

По истечении этого времени поток закрывается.

Определено в:
setEndTime в интерфейсе EventStream
Параметры:
endTime — время окончания; значение не должно быть null
См. также:
  • EventStream.start()
  • EventStream.startAsync()

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
См. также:
  • EventStream.onEvent(Consumer)
  • EventStream.onMetadata(Consumer)

onFlush

public void onFlush(Runnable action)
Описание скопировано из интерфейса: EventStream
Регистрирует действие, выполняемое после сброса потока.
Определено в:
onFlush в интерфейсе EventStream
Параметры:
action — действие, выполняемое после сброса потока; значение не должно быть null

onClose

public void onClose(Runnable action)
Описание скопировано из интерфейса: EventStream
Регистрирует действие, выполняемое при закрытии потока.

Если поток уже закрыт, действие будет немедленно выполнено в текущем потоке.

Определено в:
onClose в интерфейсе EventStream
Параметры:
action — действие, выполняемое после закрытия потока; значение не должно быть null
См. также:
  • EventStream.close()

onError

public void onError(Consumer<Throwable> action)
Описание скопировано из интерфейса: EventStream
Регистрирует действие, выполняемое при возникновении исключения.

Если действие не зарегистрировано, трассировка стека исключения выводится в стандартный поток ошибок.

Регистрация действия переопределяет поведение по умолчанию. Если зарегистрировано несколько действий, они выполняются в порядке регистрации.

Если этот метод сам генерирует исключение, результирующее поведение не определено.

Определено в:
onError в интерфейсе EventStream
Параметры:
action — действие, выполняемое при возникновении исключения; значение не должно быть null

close

public void close()
Описание скопировано из интерфейса: AutoCloseable
Закрывает этот ресурс и освобождает все связанные с ним ресурсы. Этот метод автоматически вызывается для объектов, управляемых оператором try с ресурсами.
Определено в:
close в интерфейсе AutoCloseable
Определено в:
close в интерфейсе EventStream

remove

public boolean remove(Object action)
Описание скопировано из интерфейса: EventStream
Отменяет регистрацию действия.

Если действие регистрировалось несколько раз, отменяется регистрация всех его экземпляров.

Определено в:
remove в интерфейсе EventStream
Параметры:
action — действие, регистрацию которого необходимо отменить; значение не должно быть null
Возвращает:
true, если регистрация действия была отменена; в противном случае — false
См. также:
  • EventStream.onEvent(Consumer)
  • EventStream.onEvent(String, Consumer)
  • EventStream.onFlush(Runnable)
  • EventStream.onClose(Runnable)
  • EventStream.onError(Consumer)

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
См. также:
  • setMaxAge(Duration)
  • setMaxSize(long)

awaitTermination

public void awaitTermination(Duration timeout) throws InterruptedException
Описание скопировано из интерфейса: EventStream
Блокирует выполнение до завершения всех действий, закрытия потока, наступления тайм-аута или прерывания текущего потока — в зависимости от того, что произойдет первым.
Определено в:
awaitTermination в интерфейсе EventStream
Параметры:
timeout — максимальное время ожидания; значение не должно быть null
Исключения:
InterruptedException — если ожидание было прервано
См. также:
  • EventStream.start()
  • EventStream.startAsync()
  • Thread.interrupt()

awaitTermination

public void awaitTermination() throws InterruptedException
Описание скопировано из интерфейса: EventStream
Блокирует выполнение до завершения всех действий, закрытия потока или прерывания текущего потока — в зависимости от того, что произойдет первым.
Определено в:
awaitTermination в интерфейсе EventStream
Исключения:
InterruptedException — если ожидание было прервано
См. также:
  • EventStream.start()
  • EventStream.startAsync()
  • Thread.interrupt()

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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее филиалов в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее филиалы, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API