0Pricing
Java Academy · Lekcja

Java Flight Recorder

Profilowanie przy małym narzucie

Java Flight Recorder to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest JFR?

Java Flight Recorder (JFR) to silnik profilowania i zbierania zdarzeń wbudowany bezpośrednio w JVM.

Rejestruje szczegółowe zdarzenia wykonania — próbki metod, alokacje, GC, blokady i operacje I/O — w binarnym pliku .jfr, z bardzo małym narzutem. Jest dostarczany z JDK; nie wymaga dodatkowego agenta.

Dlaczego mały narzut ma znaczenie

Tradycyjne profilery instrumentacyjne mogą spowolnić aplikację dwukrotnie lub bardziej, zniekształcając właśnie te czasy, które chcą Państwo zmierzyć.

JFR zaprojektowano tak, aby działał w środowisku produkcyjnym, zwykle z narzutem na poziomie około 1%. Dzięki temu można pozostawić go włączonego i zarejestrować dane, gdy wystąpi rzeczywisty incydent, a nie tylko w laboratorium.

Uruchamianie nagrania przy starcie

Proszę włączyć JFR za pomocą flagi JVM podczas uruchamiania aplikacji:

  • -XX:StartFlightRecording=duration=60s,filename=app.jfr

Spowoduje to rejestrowanie zdarzeń przez 60 sekund, a następnie zapisze je do pliku app.jfr. Można też uruchomić nagranie działające aż do zakończenia JVM.

Sterowanie za pomocą jcmd

Można także uruchamiać, zatrzymywać i zrzucać nagrania działającej JVM za pomocą jcmd:

  • jcmd <pid> JFR.start name=rec settings=profile
  • jcmd <pid> JFR.dump name=rec filename=out.jfr
  • jcmd <pid> JFR.stop name=rec

To idealne rozwiązanie do pobrania migawki z procesu, który już działa nieprawidłowo.

Ustawienia: default a profile

JFR jest dostarczany z dwiema wbudowanymi konfiguracjami:

  • default — minimalny narzut, bezpieczne do ciągłego użycia w środowisku produkcyjnym.
  • profile — bardziej szczegółowe próbkowanie, nieco większy koszt, do ukierunkowanego badania.

Wyboru dokonuje się za pomocą settings=profile. Można także utworzyć własną konfigurację .jfc, aby dostroić poszczególne zdarzenia.

Co rejestruje JFR

JFR rejestruje bogaty zestaw zdarzeń, w tym:

  • Próbki wykonania (gdzie zużywany jest czas procesora).
  • Alokacje obiektów i aktywność TLAB.
  • Pauzy GC.
  • Rywalizację o blokady (jdk.JavaMonitorWait).
  • Operacje I/O dotyczące plików i gniazd, wstrzymania wątków oraz wyjątki.

Każde zdarzenie ma znacznik czasu, czas trwania i ślad stosu.

Niestandardowe zdarzenia

Można definiować własne zdarzenia JFR do pomiaru czasu wykonywania logiki biznesowej. Należy rozszerzyć jdk.jfr.Event, opatrzyć klasę adnotacją, a następnie wywołać begin() i commit() wokół wykonywanej pracy.

To ta część API JFR, która nie wymaga dodatkowych komponentów. Pełne nagrywanie nadal wymaga flag JVM, ale klasa zdarzenia kompiluje się i działa na dowolnym JDK.

import jdk.jfr.Event;
import jdk.jfr.Label;

public class Main {
    @Label("Order Processing")
    static class OrderEvent extends Event {
        @Label("Order Id") int orderId;
    }

    public static void main(String[] args) {
        OrderEvent e = new OrderEvent();
        e.orderId = 42;
        e.begin();
        // ... do the work being measured ...
        e.commit();
        System.out.println("Custom JFR event committed for order " + e.orderId);
    }
}

Ciągłe nagrywanie

W przypadku usług działających długo należy uruchomić ciągłe nagranie z ograniczonym rozmiarem lub wiekiem (czyli z użyciem bufora pierścieniowego).

Starsze zdarzenia są usuwane w miarę napływania nowych, więc użycie dysku pozostaje ograniczone. Gdy wystąpi incydent, można zrzucić bufor i od razu uzyskać dane z minut poprzedzających jego wystąpienie.

Zapis przy zakończeniu

Proszę dodać dumponexit=true do flagi start-flight-recording, a JFR zapisze bufor podczas zamykania JVM.

Można połączyć to z -XX:FlightRecorderOptions, aby skonfigurować rozmiar bufora. Dzięki temu dane zostaną przechwycone nawet z procesu, który za chwilę zakończy działanie.

Odczytywanie pliku

Plik .jfr jest binarny. Analizuje się go wizualnie w narzędziu JDK Mission Control (w następnej lekcji) albo programistycznie za pomocą API jdk.jfr.consumer i RecordingFile.

Polecenie jfr print app.jfr może także zrzucić zdarzenia w formie tekstu, aby szybko je wyszukać.

Strumieniowanie zdarzeń na żywo

Od JDK 14 JFR obsługuje strumieniowanie zdarzeń za pośrednictwem API jdk.jfr.consumer.RecordingStream.

Zamiast zrzucać plik i otwierać go później, można subskrybować zdarzenia w miarę ich występowania i reagować w czasie rzeczywistym — na przykład wysyłać alerty, gdy pauzy GC przekroczą określony próg. Dzięki temu JFR staje się źródłem monitorowania na żywo, a nie tylko narzędziem do analizy po fakcie.

Szybkie sprawdzenie

Jaki jest główny powód, dla którego można pozostawić JFR uruchomiony w środowisku produkcyjnym?

Podsumowanie

JFR to wbudowany w JVM rejestrator danych:

  • Zbieranie zdarzeń z małym narzutem, bezpieczne w środowisku produkcyjnym, do plików .jfr.
  • Uruchamianie za pomocą -XX:StartFlightRecording lub jcmd JFR.start.
  • Wybór ustawień default lub profile; definiowanie niestandardowych zdarzeń.
  • Ciągłe nagrywanie z buforem pierścieniowym oraz użycie dumponexit.
  • Analiza w JDK Mission Control w następnej lekcji.

Często zadawane pytania

Czy lekcja „Java Flight Recorder” jest bezpłatna?

Tak — pełny tekst „Java Flight Recorder” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Java Flight Recorder”?

Profilowanie przy małym narzucie Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Java Flight Recorder”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Identyfikowanie wąskich gardeł
  2. Java Flight Recorder
  3. Analiza za pomocą JDK Mission Control
  4. Typowe opcje dostrajania JVM
← Powrót do Java Academy