Ich bin mit dem JIT-Compiler verwirrt,
- Was ist ein JIT-Compiler?
- Kompiliert der JIT-Compiler den Bytecode vor jeder Ausführung oder jedes Mal, wenn die JVM geladen wird?
Ich bin mit dem JIT-Compiler verwirrt,
JIT steht für "Just In Time". Es ist ein Compiler, der Java-Bytecode in nativen Maschinencode übersetzt, während Ihr Programm läuft.
Suns JIT kompiliert nicht jedes Mal, wenn Sie ein Java-Programm ausführen, den gesamten Bytecode im Voraus; es enthält eine sehr ausgeklügelte Logik, um zu entscheiden, wann Teile des Bytecodes kompiliert werden sollen, wobei eines der Kriterien die Häufigkeit der Ausführung des Codes ist.
Siehe Just-in-time-Kompilierung y HotSpot (Wikipedia) für weitere Einzelheiten.
Der JIT-Compiler ist ein spezieller Compiler, der die Ausführung von Java-Bye-Code beobachtet und ihn gegebenenfalls in native Anweisungen kompiliert.
Wenn das JIT feststellt, dass ein Teil Ihres Codes sehr häufig ausgeführt wird oder dass die Kompilierung zu nativem Code die Leistung erheblich steigern würde, wird es dies tun.
Die JIT-Kompilierung ist völlig optional, und die Standardimplementierung von Java erlaubt es, sie zu deaktivieren. Es gibt jedoch keinen wirklichen Grund, sie auszuschalten.
Der Just-in-Time-Compiler (JIT) ist ein Programm, das Java-Bytecode (ein Programm, das Anweisungen enthält, die interpretiert werden müssen) in Anweisungen umwandelt, die direkt an den Prozessor gesendet werden können.
JIT-Compiler werden als eigenständige plattformabhängige native Bibliotheken geliefert. Wenn die JIT-Compiler-Bibliothek vorhanden ist, initialisiert die Java-VM native Java Native Interface (JNI)-Code-Hooks, um die in dieser Bibliothek verfügbaren JIT-Funktionen anstelle der entsprechenden Funktion im Interpreter aufzurufen.Die Klasse java.lang.Compiler wird verwendet, um die native Bibliothek zu laden und die Initialisierung innerhalb des JIT-Compilers zu starten.Der JIT-Compiler verwendet seinen eigenen Invoker. In den Sun-Produktionsversionen wird das Methodenzugriffsbit auf den Wert ACC_MACHINE_COMPILED geprüft, um dem Interpreter mitzuteilen, dass der Code für diese Methode bereits kompiliert und in der geladenen Klasse gespeichert wurde. Wenn eine Methode zum ersten Mal aufgerufen wird (abhängig vom JVM-Anbieter), kompiliert der JIT-Compiler den Methodenblock in nativen Code für diese Methode und speichert diesen im Codeblock für diese Methode.
Sobald der Code kompiliert wurde, wird das auf der Sun-Plattform verwendete ACC_MACHINE_COMPILED-Bit gesetzt.
Zunächst ist zu bedenken, dass der JIT-Compiler den größten Teil seiner Geschwindigkeitsverbesserungen beim zweiten Aufruf einer Methode erzielt (je nach JVM-Anbieter). Der JIT-Compiler kompiliert die gesamte Methode, anstatt sie Zeile für Zeile zu interpretieren, was ebenfalls einen Leistungsgewinn bedeuten kann, wenn eine Anwendung mit aktiviertem JIT läuft. Das bedeutet, dass Sie keinen nennenswerten Leistungsgewinn erzielen, wenn der Code nur einmal aufgerufen wird. Der JIT-Compiler ignoriert auch Klassenkonstruktoren, so dass Sie den Konstruktorcode nach Möglichkeit auf ein Minimum beschränken sollten.
Der JIT-Compiler erzielt auch einen geringfügigen Leistungsgewinn, indem er bestimmte Java-Randbedingungen wie Null-Zeiger oder Array-Ausnahmen außerhalb der Grenzen nicht vorab prüft. Der JIT-Compiler weiß nur durch ein vom Betriebssystem ausgelöstes Signal, dass eine Nullzeiger-Ausnahme vorliegt. Da das Signal vom Betriebssystem und nicht von der Java-VM kommt, leidet Ihr Programm unter der Leistungseinbuße. Um die beste Leistung bei der Ausführung einer Anwendung mit dem JIT zu gewährleisten, sollten Sie sicherstellen, dass Ihr Code sehr sauber ist und keine Fehler wie Nullzeiger- oder Array-Ausnahmen außerhalb der Grenzen aufweist.
Referenz :http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.