JIT-Compiler

Der JIT-Compiler (Just-In-Time) ist eine Komponente der Laufzeitumgebung, die die Leistung von Java™ -Anwendungen verbessert, indem Bytecodes zur Laufzeit in nativen Maschinencode kompiliert werden.

Java-Programme bestehen aus Klassen, die plattformunabhängige Bytecodes enthalten, die von einer JVM auf vielen verschiedenen Computerarchitekturen interpretiert werden können. Zur Ausführungszeit lädt die JVM die Klassendateien, bestimmt die Semantik jedes einzelnen Bytecodes und führt die entsprechende Verarbeitung aus. Die zusätzliche Prozessor-und Speicherbelegung während der Interpretation bedeutet, dass eine Java-Anwendung langsamer arbeitet als eine native Anwendung. Der JIT-Compiler verbessert die Leistung von Java-Programmen, indem er Bytecodes zur Laufzeit in nativen Maschinencode kompiliert.

Der JIT-Compiler ist standardmäßig aktiviert. Wenn eine Methode kompiliert wurde, ruft die JVM den kompilierten Code dieser Methode direkt auf, statt ihn zu interpretieren. Wenn die Kompilierung keine Prozessorzeit und Speicherbelegung erfordert, könnte die Kompilierung jeder Methode theoretisch die Geschwindigkeit des Java-Programms an die einer nativen Anwendung anpassen.

Für die Kompilierung nach dem Just-in-time-Prinzip wird weder Prozessorzeit noch Speicher benötigt. Sobald die Java Virtual Machine gestartet wird, werden Tausende von Methoden aufgerufen. Die Kompilierung all dieser Methoden kann einen entscheidenden Einfluss auf die Initialisierungszeit haben, selbst dann, wenn das Programm letztendlich eine sehr gute Spitzenleistung erreicht.

In der Praxis werden Methoden nicht bei ihrem ersten Aufruf kompiliert. Für jede Methode führt die JVM einen Aufrufzähler, der mit einem vordefinierten Kompilierungsschwellenwert beginnt und bei jedem Aufruf der Methode schrittweise verringert wird. Wenn der Aufrufzähler den Wert null erreicht, wird eine Just-in-time-Kompilierung der Methode ausgelöst. Daher werden häufig verwendete Methoden kurz nach dem Start der JVM kompiliert, während andere weniger verwendete Methoden sehr viel später oder überhaupt nicht kompiliert werden. Der Schwellenwert der JIT-Kompilierung trägt dazu bei, dass die JVM schnell gestartet werden kann und die Leistung dennoch verbessert wird. Der Schwellenwert wurde ausgewählt, um eine optimale Balance zwischen Initialisierungszeiten und der langfristigen Leistung zu erreichen.

Der JIT-Compiler kann eine Methode mit verschiedenen Optimierungsstufen kompilieren: cold, warm, hot, veryHotoder scorching (siehe optlevel in -Xjit). Höhere Optimierungsstufen bieten voraussichtlich eine bessere Leistung, aber sie haben auch einen höheren Kompilierungsaufwand in Bezug auf CPU und Speicher. Die ursprüngliche (Standard-)Optimierungsstufe für eine Methode ist warm. Manchmal wird die Optimierungsstufe jedoch durch die JIT-Heuristik auf cold herabgestuft, um die Startzeit zu verbessern.

Eine Methode kann über verschiedene Mechanismen auf einer höheren Optimierungsstufe erneut kompiliert werden. Einer dieser Mechanismen ist die Stichprobenentnahme: Der JIT-Compiler verwaltet einen dedizierten Stichprobenthread, der regelmäßig aktiviert wird und bestimmt, welche Java-Methoden häufiger am Anfang des Stacks angezeigt werden. Solche Methoden gelten als wichtiger für die Leistung und sie sind Kandidaten für die Neuoptimierung auf den höheren Ebenen hot, veryHot oder scorching.

Sie können den JIT-Compiler inaktivieren. In diesem Fall wird das gesamte Java-Programm interpretiert. Von der Inaktivierung des JIT-Compilers wird jedoch abgeraten, es sei denn, sie findet aus Gründen der Diagnose oder Fehlerumgehung bei JIT-Kompilierungsproblemen statt.