JIT-Kompilierung und Tiered Compilation
Erfahren Sie, wie die JVM Methoden interpretiert und anschließend häufig ausgeführte Methoden per JIT kompiliert und wie Sie die Kompilierung auslösen und beobachten.
JIT-Kompilierung und Tiered Compilation ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Interpreter vs. JIT
Die JVM interpretiert Bytecode zunächst. Wenn eine Methode häufig aufgerufen wird (also „hot“ ist), kompiliert der JIT-Compiler sie in nativen Maschinencode, damit sie deutlich schneller ausgeführt werden kann.
Gestufte Kompilierung (Standard seit Java 8)
Die gestufte Kompilierung verwendet fünf Stufen: T0 (Interpreter), T1 (einfaches C1), T2 (C1 mit begrenztem Profiling), T3 (C1 mit vollständigem Profiling), T4 (vollständig optimiertes C2). Methoden steigen in den Stufen auf, wenn sie häufiger ausgeführt werden.
// Enable/disable tiered compilation:
// -XX:+TieredCompilation (default ON in Java 8+)
// -XX:-TieredCompilation (disables — only C2 used)C1-Compiler (Client-Compiler)
C1 kompiliert schnell und mit moderaten Optimierungen. Er fügt Profiling-Instrumentierung hinzu, um Aufrufhäufigkeiten und Verzweigungsergebnisse für C2 zu messen.
C2-Compiler (Server-Compiler)
C2 (Opto) führt tiefgreifende Optimierungen durch: Inlining, Escape-Analyse, Schleifenentrollung, Vektorisierung und Eliminierung toten Codes. Er erzeugt den schnellsten nativen Code, benötigt für die Kompilierung aber mehr Zeit.
// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp // uses C2 only (warm-up is slower)Hotspot-Schwellenwert
Eine Methode wird nach dem Überschreiten eines Schwellenwerts für den Aufrufzähler per JIT kompiliert. Standardwert: 10.000 Aufrufe (C2). Anpassen können Sie ihn mit -XX:CompileThreshold=N.
// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyAppInlining
Inlining ist C2s wirkungsvollste Optimierung: Kleine Methoden, die aus heißem Code aufgerufen werden, werden an der Aufrufstelle „kopiert“, wodurch der Overhead der Methodenverteilung entfällt und weitere Optimierungen ermöglicht werden.
// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5 com.example.User::getName (5 bytes) inlinedEscape-Analyse
Wenn C2 feststellt, dass ein Objekt die aktuelle Methode (oder den aktuellen Thread) niemals verlässt, kann es das Objekt statt auf dem Heap auf dem Stack anlegen – dadurch entfällt der GC-Druck vollständig.
// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysisJIT-Kompilierungsprotokolle
Verwenden Sie -XX:+PrintCompilation, um jede Methode zu protokollieren, sobald sie kompiliert wird. Die Ausgabe zeigt den Methodennamen, die Stufe und die Kompilierungsflags.
// 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 entrantDeoptimierung
Wenn eine JIT-Annahme verletzt wird (z. B. weil eine Klasse geladen wird, die den Empfängertyp einer Aufrufstelle ändert), führt C2 eine „Deoptimierung“ durch – es kehrt zum Interpreter oder zu C1 zurück. Das ist normal und normalerweise transparent.
Aufwärmzeit
Die JIT-Kompilierung benötigt Zeit. In kurzlebigen Prozessen werden Methoden möglicherweise nie per JIT kompiliert. Verwenden Sie Ahead-of-Time-Kompilierung (GraalVM Native Image) oder speichern Sie JIT-Ergebnisse mit Class Data Sharing (CDS), um den Start zu beschleunigen.
// 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 archiveGraalVM JIT
GraalVM ersetzt C2 durch einen in Java geschriebenen JIT-Compiler. Dadurch werden bessere Optimierungen, die Verwendung des JIT für Nicht-Java-Sprachen sowie Native Image (Ahead-of-Time-Kompilierung) ermöglicht.
Schnelltest
Welche JIT-Kompilierungstechnik beseitigt den Overhead von Methodenaufrufen, indem sie kleine Methoden in den aufrufenden Code integriert?
Zusammenfassung
Die gestufte Kompilierung führt Methoden von C1 (schnell kompilieren, Profiling) zu C2 (tiefgreifend optimieren). Wichtige Optimierungen sind Inlining, Escape-Analyse und Schleifenentrollung. Verwenden Sie -XX:+PrintCompilation, um JIT-Entscheidungen zu beobachten. Wärmen Sie den Code vor Benchmarks auf.
Häufig gestellte Fragen
Ist die Lektion „JIT-Kompilierung und Tiered Compilation“ kostenlos?
Ja — der vollständige Text von „JIT-Kompilierung und Tiered Compilation“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „JIT-Kompilierung und Tiered Compilation“?
Erfahren Sie, wie die JVM Methoden interpretiert und anschließend häufig ausgeführte Methoden per JIT kompiliert und wie Sie die Kompilierung auslösen und beobachten. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „JIT-Kompilierung und Tiered Compilation“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren
- ClassLoader-Hierarchie und eigene Loader
- Bytecode mit javap untersuchen
- JIT-Kompilierung und Tiered Compilation