Класс 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 Virtual Machine). |
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 |
Регистрирует действие, которое должно быть выполнено после того, как поток был сброшен. |
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() |
Останавливает поток записи. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе jdk.jfr.consumer.EventStream
onMetadata
Подробное описание конструкторов
ПотокЗаписи
public RecordingStream()
- Исключение:
-
IllegalStateException- если Flight Recorder не может быть создан (например, если виртуальная машина Java (JVM) не поддерживает Flight Recorder, или если репозиторий файлов не может быть создан или доступен) -
SecurityException- если существует менеджер безопасности, и у вызывающего объекта нетFlightRecorderPermission("accessFlightRecorder")
ПотокЗаписи
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, или если репозиторий файлов не может быть создан или доступен) -
SecurityException- если используется менеджер безопасности и разрешение FlightRecorderPermission "accessFlightRecorder" не установлено. - См. также:
Подробное описание методов
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), так как это, скорее всего, более производительно, чем любой механизм выбора или фильтрации, реализованный в общем действии.
- Specified by:
-
onEventв интерфейсеEventStream - Параметры:
-
action- действие для выполнения на каждомRecordedEvent, а неnull - См. также:
onFlush
public void onFlush(Runnable action)
EventStream- Specified by:
-
onFlushв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после сброса потока, а неnull
onClose
public void onClose(Runnable action)
EventStreamЕсли поток уже закрыт, действие будет выполнено немедленно в текущей нити.
- Specified by:
-
onCloseв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после закрытия потока, а неnull - См. также:
onError
public void onError(Consumer<Throwable> action)
EventStreamЕсли действие не зарегистрировано, трассировка стека исключений выводится в стандартный вывод ошибок.
Регистрация действия переопределяет стандартное поведение. Если зарегистрировано несколько действий, они выполняются в порядке регистрации.
Если данная функция сама вызывает исключение, поведение является неопределенным.
- Specified by:
-
onErrorв интерфейсеEventStream - Параметры:
-
action- действие для выполнения, если произойдет исключение, а неnull
close
public void close()
AutoCloseabletry-with-resources.- Specified by:
-
closeв интерфейсеAutoCloseable - Specified by:
-
closeв интерфейсеEventStream
remove
public boolean remove(Object action)
EventStreamЕсли действие зарегистрировано несколько раз, все экземпляры удаляются.
- Specified by:
-
removeв интерфейсеEventStream - Параметры:
-
action- действие для удаления, а неnull - Возвращает:
-
trueесли действие было удалено,falseв противном случае - См. также:
start
public void start()
EventStreamДействия выполняются в текущей нити.
Чтобы остановить поток, используйте метод EventStream.close().
- Specified by:
-
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);
}
- Specified by:
-
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- если данные записи не могут быть скопированы в указанное расположение, или если поток закрыт или не запущен. -
SecurityException- если существует менеджер безопасности и у вызывающего объекта нетFilePermissionдля записи в целевой путь - С момента:
- 17
- См. также:
awaitTermination
public void awaitTermination(Duration timeout) throws InterruptedException
EventStream- Specified by:
-
awaitTerminationв интерфейсеEventStream - Параметры:
-
timeout- максимальное время ожидания, а неnull - Исключение:
-
InterruptedException- если произошло прерывание во время ожидания - См. также:
awaitTermination
public void awaitTermination() throws InterruptedException
EventStream- Specified by:
-
awaitTerminationв интерфейсеEventStream - Исключение:
-
InterruptedException- если произошло прерывание во время ожидания - См. также:
© 1993, 2023, 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/21/docs/api/jdk.jfr/jdk/jfr/consumer/RecordingStream.html