0Pricing
Java Academy · Lekcja

Kompilacja JIT i kompilacja warstwowa

Proszę poznać sposób, w jaki JVM najpierw interpretuje, a następnie kompiluje metodą JIT często wywoływane metody, oraz jak wyzwalać i obserwować kompilację.

Kompilacja JIT i kompilacja warstwowa to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 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.

Interpreter a JIT

Początkowo JVM interpretuje kod bajtowy. Gdy metoda jest często wywoływana („gorąca”), kompilator JIT kompiluje ją do natywnego kodu maszynowego, aby znacznie przyspieszyć jej wykonywanie.

Kompilacja warstwowa (domyślna od Java 8)

Kompilacja warstwowa wykorzystuje pięć poziomów: T0 (interpreter), T1 (prosty C1), T2 (C1 z ograniczonym profilowaniem), T3 (C1 z pełnym profilowaniem), T4 (w pełni zoptymalizowany C2). Metody przechodzą na wyższe poziomy w miarę wzrostu ich „gorącości”.

// Enable/disable tiered compilation:
// -XX:+TieredCompilation   (default ON in Java 8+)
// -XX:-TieredCompilation   (disables — only C2 used)

Kompilator C1 (kompilator kliencki)

C1 kompiluje szybko i stosuje umiarkowane optymalizacje. Dodaje instrumentację profilującą do pomiaru częstotliwości wywołań i wyników rozgałęzień na potrzeby C2.

Kompilator C2 (kompilator serwerowy)

C2 (Opto) przeprowadza zaawansowane optymalizacje: inlining, analizę ucieczki, rozwijanie pętli, wektoryzację i eliminowanie martwego kodu. Generuje najszybszy kod natywny, ale jego kompilacja trwa dłużej.

// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp   // uses C2 only (warm-up is slower)

Próg HotSpot

Metoda jest kompilowana przez JIT po przekroczeniu progu licznika wywołań. Wartość domyślna: 10 000 wywołań (C2). Dostosuj ją za pomocą -XX:CompileThreshold=N.

// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyApp

Inlining

Inlining to najbardziej znacząca optymalizacja C2: małe metody wywoływane z gorącego kodu są „wklejane” w miejscu wywołania, co eliminuje narzut rozsyłania wywołań metod i umożliwia dalsze optymalizacje.

// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5  com.example.User::getName (5 bytes)   inlined

Analiza ucieczki

Jeśli C2 ustali, że obiekt nigdy nie opuszcza bieżącej metody (ani wątku), może przydzielić go na stosie zamiast na stercie — całkowicie eliminując obciążenie powodowane przez GC.

// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysis

Dzienniki kompilacji JIT

Użyj -XX:+PrintCompilation, aby rejestrować każdą metodę w momencie jej kompilacji. Wyjście pokazuje nazwę metody, poziom i flagi kompilacji.

// java -XX:+PrintCompilation MyApp
// Output:
//    1   n    java.lang.String::hashCode (0 bytes)
//   25   3    com.example.UserService::findById (42 bytes)
//   31   4    com.example.UserService::findById (42 bytes) made not entrant

Deoptymalizacja

Jeśli założenie JIT zostanie naruszone (np. załadowana zostanie klasa, która zmienia typ odbiorcy w miejscu wywołania), C2 przeprowadza „deoptymalizację” — powraca do interpretera lub C1. To normalne działanie i zwykle jest niewidoczne dla programu.

Czas rozgrzewania

Kompilacja JIT zajmuje czas. W krótkotrwałych procesach metody mogą nigdy nie zostać skompilowane przez JIT. Użyj kompilacji ahead-of-time (GraalVM Native Image) albo buforuj wyniki JIT za pomocą Class Data Sharing (CDS), aby przyspieszyć uruchamianie.

// Enable AppCDS to cache JIT-compilable classes:
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar MyApp   # generate archive
java -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp       # use archive

JIT GraalVM

GraalVM zastępuje C2 kompilatorem JIT napisanym w Javie. Umożliwia stosowanie lepszych optymalizacji, używanie JIT dla języków innych niż Java i stanowi podstawę Native Image (kompilacji ahead-of-time).

Szybkie sprawdzenie

Jak nazywa się technika kompilacji JIT, która eliminuje narzut wywołania metody przez włączenie małych metod do kodu wywołującego?

Podsumowanie

Kompilacja warstwowa przenosi metody przez C1 (szybka kompilacja, profilowanie) do C2 (zaawansowana optymalizacja). Kluczowe optymalizacje: inlining, analiza ucieczki i rozwijanie pętli. Użyj -XX:+PrintCompilation, aby obserwować decyzje JIT. Rozgrzej JVM przed pomiarami wydajności.

Często zadawane pytania

Czy lekcja „Kompilacja JIT i kompilacja warstwowa” jest bezpłatna?

Tak — pełny tekst „Kompilacja JIT i kompilacja warstwowa” 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 „Kompilacja JIT i kompilacja warstwowa”?

Proszę poznać sposób, w jaki JVM najpierw interpretuje, a następnie kompiluje metodą JIT często wywoływane metody, oraz jak wyzwalać i obserwować kompilację. Ć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 4 z 4.

Ile czasu zajmuje lekcja „Kompilacja JIT i kompilacja warstwowa”?

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. Fazy ładowania klas: Load, Link, Initialize
  2. Hierarchia ClassLoader i własne ładowarki
  3. Inspekcja kodu bajtowego za pomocą javap
  4. Kompilacja JIT i kompilacja warstwowa
← Powrót do Java Academy