Java Language
Just in Time (JIT) -Compiler
Suche…
Bemerkungen
Geschichte
Der Symantec JIT-Compiler war ab 1.1.5 in Sun Java verfügbar, hatte jedoch Probleme.
Der Hotspot-JIT-Compiler wurde in Sun Java 1.2.2 als Plugin hinzugefügt. In Java 1.3 wurde JIT standardmäßig aktiviert.
Überblick
Der Just-In-Time-Compiler (JIT) ist eine Komponente der Java-Laufzeitumgebung, die die Leistung von Java-Anwendungen zur Laufzeit verbessert.
- Java-Programme bestehen aus Klassen, die plattformneutrale Bytecodes enthalten, die von einer JVM auf vielen verschiedenen Computerarchitekturen interpretiert werden können.
- Zur Laufzeit lädt die JVM die Klassendateien, bestimmt die Semantik jedes einzelnen Bytecodes und führt die entsprechende Berechnung aus.
Die zusätzliche Prozessor- und Speicherverwendung 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 zur Laufzeit Bytecodes in nativen Maschinencode kompiliert.
Der JIT-Compiler ist standardmäßig aktiviert und wird beim Aufruf einer Java-Methode aktiviert. Der JIT-Compiler kompiliert die Bytecodes dieser Methode in nativen Maschinencode und kompiliert ihn "just in time"
zur Ausführung.
Wenn eine Methode kompiliert wurde, ruft die JVM den kompilierten Code dieser Methode direkt auf, anstatt sie zu interpretieren. Wenn die Kompilierung keine Prozessorzeit und Speicherauslastung erfordert, kann theoretisch das Kompilieren jeder Methode die Geschwindigkeit des Java-Programms ermöglichen, sich der einer nativen Anwendung anzunähern.
Bei der JIT-Kompilierung sind Prozessorzeit und Speicherbedarf erforderlich. Beim ersten Start der JVM werden Tausende von Methoden aufgerufen. Das Kompilieren all dieser Methoden kann die Startzeit erheblich beeinflussen, auch wenn das Programm letztendlich eine sehr gute Spitzenleistung erreicht.
- In der Praxis werden Methoden beim ersten Aufruf nicht kompiliert. Für jede Methode unterhält die JVM einen
call count
der bei jedemcall count
der Methode inkrementiert wird. - Die JVM interpretiert eine Methode so lange, bis ihre Aufrufzählung einen Schwellenwert für die JIT-Kompilierung überschreitet.
- Daher werden häufig verwendete Methoden bald nach dem Start der JVM kompiliert. Weniger verwendete Methoden werden viel später oder gar nicht kompiliert.
- Der Schwellenwert für die JIT-Kompilierung hilft der JVM, schnell zu starten und dennoch die Leistung zu verbessern.
- Die Schwelle wurde sorgfältig ausgewählt, um ein optimales Gleichgewicht zwischen Anlaufzeiten und langfristiger Leistung zu erzielen.
- Nachdem eine Methode kompiliert wurde, wird ihre Aufrufzählung auf null zurückgesetzt, und nachfolgende Aufrufe der Methode erhöhen weiterhin ihre Zählung.
- Wenn der Aufrufzähler einer Methode einen Schwellenwert für die JIT-Neukompilierung erreicht, kompiliert der JIT-Compiler dies ein zweites Mal und wendet eine größere Auswahl an Optimierungen an als bei der vorherigen Kompilierung.
- Dieser Vorgang wird wiederholt, bis der maximale Optimierungsgrad erreicht ist.
Die aktivsten Methoden eines Java-Programms werden immer äußerst aggressiv optimiert, um die Leistungsvorteile des JIT-Compilers zu maximieren.
Der JIT-Compiler kann auch operational data at run time
messen und diese Daten verwenden, um die Qualität weiterer Rekompilierungen zu verbessern.
Der JIT-Compiler kann deaktiviert werden. In diesem Fall wird das gesamte Java-Programm interpretiert. Das Deaktivieren des JIT-Compilers wird nicht empfohlen, es sei denn, JIT-Kompilierungsprobleme werden diagnostiziert oder umgangen.