Die kanonische JVM-Implementierung von Sun wendet eine ziemlich ausgefeilte Optimierung auf Bytecode an, um nahezu native Ausführungsgeschwindigkeiten zu erhalten, nachdem der Code einige Male ausgeführt wurde.
Die Frage ist, warum dieser kompilierte Code nicht zur späteren Verwendung derselben Funktion / Klasse auf der Festplatte zwischengespeichert wird.
So wie es aussieht, wird der JIT-Compiler jedes Mal, wenn ein Programm ausgeführt wird, neu gestartet, anstatt eine vorkompilierte Version des Codes zu verwenden. Würde das Hinzufügen dieser Funktion die anfängliche Laufzeit des Programms nicht erheblich verbessern, wenn der Bytecode im Wesentlichen interpretiert wird?
Antworten:
Ohne auf das Ausschneiden und Einfügen des von @MYYN geposteten Links zurückzugreifen, liegt dies vermutlich daran, dass die von der JVM durchgeführten Optimierungen nicht statisch, sondern dynamisch sind und sowohl auf den Datenmustern als auch auf den Codemustern basieren. Es ist wahrscheinlich, dass sich diese Datenmuster während der Lebensdauer der Anwendung ändern und die zwischengespeicherten Optimierungen nicht optimal sind.
Sie benötigen also einen Mechanismus, um festzustellen, ob die gespeicherten Optimierungen noch optimal sind. Zu diesem Zeitpunkt können Sie sie auch im laufenden Betrieb erneut optimieren.
quelle
Die JVM von Oracle ist in der Tat dafür dokumentiert - unter Angabe von Oracle,
Ich weiß nicht, warum alle hoch entwickelten VM-Implementierungen keine ähnlichen Optionen bieten.
quelle
Eine Aktualisierung der vorhandenen Antworten - Java 8 verfügt über einen JEP, der sich der Lösung dieses Problems widmet:
=>
JEP 145: Cache-kompilierten Code. Neuer Link .Auf sehr hohem Niveau ist das erklärte Ziel :
Hoffe das hilft.
quelle
Excelsior JET verfügt seit der 2001 veröffentlichten Version 2.0 über einen Caching-JIT-Compiler. Darüber hinaus kann der AOT-Compiler den Cache unter Verwendung aller Optimierungen in eine einzelne DLL / ein gemeinsames Objekt neu kompilieren.
quelle
Ich kenne die tatsächlichen Gründe nicht, da ich in keiner Weise an der JVM-Implementierung beteiligt bin, aber ich kann mir einige plausible vorstellen:
Aber ich vermute wirklich, und wie Sie sehen können, glaube ich nicht, dass einer meiner Gründe tatsächliche Show-Stopper sind. Ich denke, Sun betrachtet diese Unterstützung einfach nicht als Priorität, und vielleicht liegt mein erster Grund nahe an der Wahrheit, da dies gewöhnlich auch dazu führt, dass die Leute denken, dass Java-Klassendateien wirklich eine separate Version für jede VM benötigen, anstatt zu sein plattformübergreifend.
Mein bevorzugter Weg wäre tatsächlich, einen separaten Bytecode-zu-Native-Übersetzer zu haben, mit dem Sie so etwas explizit im Voraus ausführen können, um Klassendateien zu erstellen, die explizit für eine bestimmte VM erstellt wurden und möglicherweise den ursprünglichen Bytecode enthalten kann auch mit verschiedenen VMs ausgeführt werden. Aber das kommt wahrscheinlich aus meiner Erfahrung: Ich habe hauptsächlich Java ME gemacht, wo es wirklich weh tut, dass der Java-Compiler beim Kompilieren nicht schlauer ist.
quelle