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