Spec-Zone.ru › OpenJDK 27

Класс RecordingStream

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

В следующем примере показано, как записывать события с использованием конфигурации по умолчанию и выводить в стандартный поток вывода события «Сборка мусора», «Загрузка ЦП» и «Информация о 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();
}
Начиная с:
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
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект другому объекту.
protected void finalize()
Устарело и подлежит удалению: этот элемент API может быть удален в будущей версии.
Финализация устарела и подлежит удалению в одном из следующих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения для этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания.
final void wait(long timeoutMillis)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени.

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

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-with-resources.
Определен в:
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, 2026, 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.

Spec-Zone.ru

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