Класс RemoteRecordingStream
- Все реализуемые интерфейсы:
-
AutoCloseable,EventStream
public final class RemoteRecordingStream extends Object implements EventStream
EventStream, которая может сериализовать события по сети с помощью MBeanServerConnection. Следующий пример демонстрирует, как записывать паузы сбора мусора и использование ЦП на удалённом хосте и выводить события в стандартный вывод.
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (var rs = new RemoteRecordingStream(conn)) {
rs.enable("jdk.GCPhasePause").withoutThreshold();
rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
rs.onEvent("jdk.CPULoad", System.out::println);
rs.onEvent("jdk.GCPhasePause", System.out::println);
rs.start();
}
- С момента:
- 16
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
RemoteRecordingStream |
Создаёт поток событий, работающий с MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. |
RemoteRecordingStream |
Создаёт поток событий, работающий с MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
awaitTermination() |
Ожидает, пока все действия будут завершены, или поток будет закрыт, или текущий поток будет прерван, в зависимости от того, что произойдёт первым. |
void |
awaitTermination |
Ожидает, пока все действия будут завершены, или поток будет закрыт, или истечёт таймаут, или текущий поток будет прерван, в зависимости от того, что произойдёт первым. |
void |
close() |
Освобождает все ресурсы, связанные с этим потоком. |
EventSettings |
disable |
Отключает событие с указанным именем. |
void |
dump |
Записывает данные записи в файл. |
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
Подробное описание конструкторов
RemoteRecordingStream
public RemoteRecordingStream(MBeanServerConnection connection) throws IOException
MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. Для настройки параметров событий используйте setSettings(Map).
- Параметры:
-
connection-MBeanServerConnection, где зарегистрированFlightRecorderMXBean, а неnull - Исключения:
-
IOException- если поток нельзя открыть, при возникновении ошибки ввода-вывода при попытке доступа к репозиторию илиFlightRecorderMXBean -
SecurityException- если существует менеджер безопасности, и его методcheckReadзапрещает чтение каталога или файлов в каталоге.
RemoteRecordingStream
public RemoteRecordingStream(MBeanServerConnection connection, Path directory) throws IOException
MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. Для настройки параметров событий используйте setSettings(Map).
- Параметры:
-
connection-MBeanServerConnection, где зарегистрированFlightRecorderMXBean, а неnull -
directory- каталог для хранения данных событий, загружаемых, а неnull - Исключения:
-
IOException- если поток нельзя открыть, при возникновении ошибки ввода-вывода при попытке доступа к репозиторию илиFlightRecorderMXBean -
SecurityException- если существует менеджер безопасности, и его методcheckReadзапрещает чтение каталога или файлов в каталоге.
Подробное описание методов
setSettings
public void setSettings(Map<String,String> settings)
Следующий пример подключается к удалённому хосту и получает потоки событий, используя настройки из конфигурации "default".
{
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (final var rs = new RemoteRecordingStream(conn)) {
rs.onMetadata(e -> {
for (Configuration c : e.getConfigurations()) {
if (c.getName().equals("default")) {
rs.setSettings(c.getSettings());
}
}
});
rs.onEvent(System.out::println);
rs.start();
}
- Параметры:
-
settings- настройки для установки, а неnull - См. также:
disable
public EventSettings disable(String name)
Если несколько событий имеют одно и то же имя (например, один и тот же класс загружен в разных загрузчиках классов), то отключаются все события, соответствующие имени.
- Параметры:
-
name- настройки для события, а неnull - Возвращает:
- настройки события для дальнейшей настройки, а не
null
enable
public EventSettings enable(String name)
Если несколько событий имеют одно и то же имя (например, один и тот же класс загружен в разных загрузчиках классов), то включаются все события, соответствующие имени.
- Параметры:
-
name- настройки для события, а неnull - Возвращает:
- настройки события для дальнейшей настройки, а не
null - См. также:
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
onEvent
public void onEvent(Consumer<RecordedEvent> action)
EventStreamДля выполнения действия над подмножеством типов событий, рассмотрите использование EventStream.onEvent(String, Consumer) и EventStream.onMetadata(Consumer), так как это, вероятно, более производительно, чем любая механизма выбора или фильтрации, реализованная в универсальном действии.
- Определено в:
-
onEventв интерфейсеEventStream - Параметры:
-
action- действие, которое необходимо выполнить для каждогоRecordedEvent, а неnull - См. также:
onEvent
public void onEvent(String eventName, Consumer<RecordedEvent> action)
EventStream- Определено в:
-
onEventв интерфейсеEventStream - Параметры:
-
eventName- имя события, а неnull -
action- действие для выполнения для каждогоRecordedEvent, соответствующего имени события, а неnull
onFlush
public void onFlush(Runnable action)
EventStream- Определено в:
-
onFlushв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после сброса потока, а неnull
onError
public void onError(Consumer<Throwable> action)
EventStreamЕсли действие не зарегистрировано, стек исключения выводится на стандартный вывод ошибки.
Регистрация действия переопределяет поведение по умолчанию. Если зарегистрированы несколько действий, они выполняются в порядке регистрации.
Если этот метод сам вызывает исключение, поведение является неопределённым.
- Определено в:
-
onErrorв интерфейсеEventStream - Параметры:
-
action- действие для выполнения, если произойдёт исключение, а неnull
onClose
public void onClose(Runnable action)
EventStreamЕсли поток уже закрыт, действие будет выполнено немедленно в текущей нити.
- Определено в:
-
onCloseв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после закрытия потока, а неnull - См. также:
close
public void close()
EventStreamЕсли поток запущен, асинхронно или синхронно, он останавливается немедленно или после следующего сброса. Этот метод НЕ гарантирует, что все зарегистрированные действия будут завершены до возврата.
Закрытие ранее закрытого потока не имеет эффекта.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеEventStream
remove
public boolean remove(Object action)
EventStreamЕсли действие было зарегистрировано несколько раз, все экземпляры будут отменены.
- Определено в:
-
removeв интерфейсеEventStream - Параметры:
-
action- действие для отмены регистрации, неnull - Возвращает:
-
trueесли действие было отменено,falseв противном случае - См. также:
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 - См. также:
start
public void start()
EventStreamДействия выполняются в текущей нити.
Чтобы остановить поток, используйте метод EventStream.close().
- Определено в:
-
startв интерфейсеEventStream
startAsync
public void startAsync()
EventStreamДействия выполняются в отдельной нити.
Чтобы остановить поток, используйте метод EventStream.close().
- Определено в:
-
startAsyncв интерфейсеEventStream
stop
public boolean stop()
Останавливает запущенный поток и ожидает, пока все события в записи будут обработаны.
Вызов этого метода в действии, например, в методе onEvent(Consumer), может заблокировать поток на неопределенное время. Чтобы резко остановить поток, используйте метод close().
Следующий фрагмент кода демонстрирует, как этот метод может быть использован совместно с методом startAsync() для отслеживания того, что происходит во время метода тестирования:
AtomicLong bytesWritten = new AtomicLong();
try (var r = new RemoteRecordingStream(connection)) {
r.setMaxSize(Long.MAX_VALUE);
r.enable("jdk.FileWrite").withoutThreshold();
r.onEvent(event ->
bytesWritten.addAndGet(event.getLong("bytesWritten"))
);
r.startAsync();
testFoo();
r.stop();
if (bytesWritten.get() > 1_000_000L) {
r.dump(Path.of("file-write-events.jfr"));
throw new AssertionError("testFoo() writes too much data to disk");
}
}
- Возвращает:
-
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- Определено в:
-
awaitTerminationв интерфейсеEventStream - Параметры:
-
timeout- максимальное время ожидания, неnull - Исключения:
-
InterruptedException- если ожидание прервано - См. также:
awaitTermination
public void awaitTermination() throws InterruptedException
EventStream- Определено в:
-
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.management.jfr/jdk/management/jfr/RemoteRecordingStream.html