tgoop.com/javaproglib/6430
Last Update:
Если вам нужно анализировать производительность приложения в реальном времени, но профилировщики вроде VisualVM или async-profiler слишком тяжелые, то Java Flight Recorder (JFR) Event Streaming — ваш новый лучший друг.
JFR давно встроен в JVM и собирает метрики без ощутимого влияния на производительность (накладные расходы <1%). Раньше, чтобы получить данные, нужно было снимать дамп и разбирать его постфактум. Начиная с Java 14 пакет jdk.jfr.consumer предоставляет API, благодаря которому можно стримить события в реальном времени прямо в приложение.
🔹 Пример использования
Допустим, вы хотите следить за количеством вызовов System.gc() (или любыми другими JVM-событиями):
import jdk.jfr.consumer.*;
public class JfrStreamingExample {
public static void main(String[] args) {
try (var stream = EventStream.openRepository()) {
stream.onEvent("jdk.GarbageCollection", event ->
System.out.println("GC event: " + event.getLong("gcId"))
);
stream.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
🔹 Что происходит
▪️ EventStream.openRepository() — подключается к JFR и слушает события онлайн
▪️ onEvent("jdk.GarbageCollection", callback) — подписывается на сборку мусора
▪️ stream.start(); — запускает стриминг
🔹 Где полезно
🔹 Что нужно знать
▪️ Работает без agent'ов и почти без overhead.
▪️ Доступно из коробки в OpenJDK 14+.
▪️ Встроенные события JVM уже можно стримить, но для своих нужно создать Custom JFR Events.