Spec-Zone.ru › OpenJDK 24

Класс RecordingStream

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

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

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

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

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

RecordingStream

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

Spec-Zone.ru

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