www.wikidata.de-de.nina.az
Dieser Artikel behandelt eine Java Virtual Machine zu weiteren Bedeutungen siehe Hot Spot HotSpot ist eine unter dem Namen Java HotSpot Performance Engine 3 veroffentlichte sehr weit verbreitete Java Virtual Machine von Oracle vorher von Sun Microsystems fur Arbeitsplatzrechner und Server Sie basiert auf Techniken wie Just in time Kompilierung und adaptiver Optimierung um das Laufzeitverhalten von Software wahrend der Ausfuhrung zu verbessern HotSpotBasisdatenMaintainer OracleEntwickler OracleErscheinungsjahr 1999 1 Aktuelle Version 22 12 Dezember 2011 Betriebssystem plattformubergreifendProgrammiersprache C 2 AssemblerspracheKategorie Java Virtual MachineLizenz GNU General Public Licenseopenjdk java net groups hotspot Inhaltsverzeichnis 1 Entstehungsgeschichte 2 Uberblick 3 Hotspot Erkennung Compile Policy 4 Kompilierung 5 Optimierung 6 Codegenerierung Aktivierung 6 1 AD Dateien 6 2 CompileCache 6 3 Stubs 7 Aktivieren des Kompilats 8 Literatur 9 Quellen 10 WeblinksEntstehungsgeschichte BearbeitenDer Ursprung von HotSpot geht auf eine Gruppe von Programmierern zuruck die Anfang der 1990er Jahre bei Sun Microsystems an der Programmiersprache Self gearbeitet hatten Diese Programmierer Lars Bak Gilad Bracha Steffen Grarup David Griswold Robert Griesemer und Urs Holzle verliessen 1994 Sun und grundeten gemeinsam eine Firma namens Longview Technologies die auch unter dem Namen Animorphic Systems auftrat um dort die auf Smalltalk Programmiersprache basierte optional typisierte Programmiersprache Strongtalk zu entwickeln Dort gelang Urs Holzle die Entwicklung eines Type Feedback Compilers und auch die Strongtalk VM machte grosse Fortschritte 4 Aufgrund der sturmischen Entwicklung der neuen von Sun herausgebrachten Programmiersprache Java entschloss man sich eine grundlegend neue Java Virtual Machine zu entwickeln In dieser Zeit wurde Srdjan Mitrovic aufgenommen der fur die Integration von Java in die neue VM sorgte 1997 kaufte Sun 5 Longview Technologies 6 und Lars Bak wurde fuhrender Ingenieur der Hotspot VM bei Sun Zum Zeitpunkt der Ubernahme war HotSpot rund doppelt so schnell wie damals am Markt befindliche JVMs 7 8 Sun Microsystems seinerseits wurde 2010 von Oracle ubernommen Uberblick BearbeitenDer Sun Java Server auch Opto oder C2 Compiler verwandelt den Java Bytecode der Java Virtual Machine JVM in ausfuhrbaren Maschinencode der entsprechenden Zielplattform Es handelt sich um einen hochoptimierenden Just in time Compiler JIT Just in time Compiler erzeugen den Maschinencode im Gegensatz zu Ahead of time Compilern wie beispielsweise GCC erst zur Laufzeit des Programms Damit schlagt der Ubersetzungsvorgang selbst neben der eigentlichen Laufzeit des Programms in Form von CPU Zyklen und langerer Laufzeit zu Buche Da dieser Kompilier Vorgang allerdings nur adaptiv das heisst bei einigen Methoden so genannten Hotspots angewandt wird dieser Aufwand einmalig und insbesondere bei langlaufenden Serveranwendungen sehr kurz verglichen mit der Programm Ausfuhrungszeit ist wird dieser Mehraufwand schnell durch die hohere Qualitat des erzeugten Maschinencodes kompensiert Ausserdem erfolgt die Kompilierung in einem gesonderten Thread der auf SMP Maschinen normalerweise auf einer gesonderten CPU ausgefuhrt wird Zu Beginn der Laufzeit eines Java Programms wird der gesamte Bytecode ausschliesslich interpretiert Das geschieht in einer Interpreterschleife die Bytecode fur Bytecode abarbeitet Die Besonderheit von Hotspot Compilern liegt nun darin nur haufig benutzte Codeabschnitte so genannte Hotspots sukzessive in Maschinencode zu ubersetzen Die Hotspots werden unter anderem auch lokal das heisst innerhalb von Methoden entdeckt die kleinste Kompiliereinheit ist aber in jedem Fall die Methode Da die Ubersetzung nur bei besonders haufig genutzten oder langlaufenden Methoden und nicht mit dem gesamten Code geschieht ist der Mehraufwand speziell bei langlaufenden Anwendungen vernachlassigbar Der Vorteil dieses Verfahrens liegt in der Moglichkeit Closed world Optimierungen durchzufuhren sowie Dynamische Optimierungen anwenden zu konnen Dies bedeutet dass die JVM immer den gesamten geladenen Bytecode kennt und anhand dessen Optimierungsentscheidungen treffen kann welche die Semantik des Codes so verandern dass dieser nur mehr unter den vorhandenen Einsatzbedingungen korrekt funktioniert Wird zur Laufzeit Code geladen welcher diese Einsatzbedingungen andert so fuhrt die Server Hotspot VM eine Deoptimierung durch und garantiert somit die korrekte Funktion indem es den fur diesen Einsatz zu aggressiv optimierten Code entfernt und erneut optimiert Der Kompiliervorgang des Sun Hotspot Compilers setzt sich aus den folgenden Schritten zusammen Hotspot Erkennung Compile Policy BearbeitenDas grundsatzliche Verfahren wie und unter welchen Umstanden eine Methode ubersetzt wird wird in der Sun JVM durch so genannte CompilePolicies definiert Diese in einer C Klassenhierarchie modellierten Richtlinien sind im Fall des Server Compilers in der Klasse StackWalkCompPolicy gespeichert Somit kann durch Wechseln beziehungsweise Anpassen der Richtlinien der Kompiliervorgang umkonfiguriert werden Das kommt in der Praxis allerdings relativ selten vor vom Setzen des Flags XX CompileTheWorld zum Ubersetzen buchstablich aller Methoden einmal abgesehen Der Name StackWalkCompPolicy geht auf den Algorithmus zuruck den Aufrufstack der zu untersuchenden Methoden solange nach oben zu prufen bis die erste Methode entdeckt wird die nicht mehr zu einem Inlining fuhren wird Im Servercompiler werden zur Erkennung der Hotspots zwei Schwellwerte herangezogen Aufrufhaufigkeit einer Methode Dieser Schwellwert wird in der JVM internen Variable CompileThreshold gehalten und hat auf den verschiedenen Plattformen unterschiedliche Grundeinstellungen Auf der Intel 386 Architektur sind es bei der Server JVM 10 000 und bei der Client JVM 1 500 Methodenaufrufe Anzahl von Schleifendurchlaufen in einer Methode Werden Schleifen in Methoden allzu haufig durchlaufen markiert dies eine Methode ebenfalls zur Kompilierung Die Haufigkeit eines Schleifendurchlaufs wiederum wird in so genannten Backedge Countern fur jede Schleife einzeln mitgezahlt Im Servercompiler befinden sich bereits Vorkehrungen in spateren Versionen eine so genannte Two tier Kompilierung zu unterstutzen Dabei geht es darum eine Methode zuerst zugig und ohne massive Optimierung zu kompilieren und spater oder parallel in einem weiteren Durchlauf hochoptimiert zu ubersetzen Diese two tier compilation wird perspektivisch zu einer Verschmelzung von Server und Client Compiler fuhren Kompilierung BearbeitenNachdem die Policy Steuerung einzelne Methoden nun zum Kompilieren markiert hat wird fur jede der Methoden ein CompileTask Object erzeugt und in die CompileQueue eingereiht Das sowie die sonstige Kontrolle des gesamten Ubersetzungsvorgangs obliegt dem CompileBroker Dieser erzeugt die einzelnen Ubersetzungsjobs CompileTask stellt sie in die Queue und weckt zuletzt mit einem notify inaktive Compile Threads Die Anzahl der Compile Threads ist im Normalfall log Anzahl der CPUs doch mindestens zwei Im CompileBroker werden auch diverse PerfCounter Objekte gehalten die zur spateren Leistungsuberwachung beziehungsweise anzeige herangezogen werden konnen Nun wird der Bytecode in verschiedenen Phasen umgewandelt Die wichtigsten Schritte sind hierbei Parsen des Bytecodes Loschen ungenutzter Knoten nodes Auswahlen der Instruktionen Global Value Numbering GVN Control Flow Graph CFG erzeugen Register Allocation Chaitin Graph Coloring Peephole OptimierungDie Internal Representation IR des Programmlaufs wird im SSA Format gespeichert Optimierung BearbeitenUnter anderem durch die Speicherung des Knoten Graphs im SSA Format ist es moglich eine Reihe von Optimierungsverfahren anzuwenden Hier die wichtigsten Inlining Kurze Methoden maximal 35 Bytes werden in den Rumpf des Aufrufers eingefugt anstatt angesprungen zu werden Bei langeren Methoden rentiert sich Inlining nicht Loop Unrolling Kurze Schleifen werden sozusagen entrollt das heisst die einzelnen Schleifendurchlaufe werden sequenziell ohne Rucksprung abgearbeitet Das vergrossert ahnlich dem Inlining den Speicherverbrauch ist aber bei wenigen Schleifendurchlaufen billiger als das standige Testen einer Sprungbedingung Dead Code Elimination Ungenutzte Anweisungen werden auf Bytecodeebene entdeckt und verworfen Obwohl diese Optimierung auf Quellcodeebene durch den Java Frontend Compiler javac weit mehr Anwendung findet wird dieser Schritt auch auf Bytecodeebene angewendet Peephole Optimierung Optimierung auf Assemblerebene Hierbei wird ein Kontext peephole uber einige wenige Assembler Instruktionen erzeugt und zum Beispiel redundante Speicherzugriffe eliminiert und Registerzugriffe optimiert Codegenerierung Aktivierung BearbeitenAD Dateien Bearbeiten Der Codegenerator Emitter des Systems erzeugt Maschinencode auf der Basis von vorgefertigten Schablonen die zu dem Bytecode korrespondierende Assemblercodestrecken in so genannten Architecture Description Files AD Dateien speichern In diesen Dateien werden die verschiedenen CPUs abstrakt mit ihren Assemblerbefehlen Adressiermodi und besonders der Anzahl und Breite der Register beschrieben Die AD Dateien werden mittels eines speziellen Preprozessors in C Klassen ubersetzt die in den VM Buildprozess einfliessen CompileCache Bearbeiten Die von dem Compiler erstellten Assemblersprache Instruktionen werden im CompilerCache mit einer Referenz auf den ursprunglichen Bytecode abgelegt Das ist notwendig um bei einer spateren Deoptimierung wieder auf den Bytecode zugreifen zu konnen Deoptimierung kann notig werden wenn etwa dynamisch geladene Klassen in denen einzelnen Methoden eingebettet wurden Inlining zur Laufzeit durch neue ersetzt werden Stubs Bearbeiten Der durch den Kompiliervorgang erzeugte Maschinencode kann ohne Inanspruchnahme von Services der VM nicht funktionieren In einer Methode muss zum Beispiel immer wieder ein name lookup in der Symboltabelle vorgenommen eine Referenz aufgelost oder andere Dienstleistungen der JVM in Anspruch genommen werden Deswegen werden in den Maschinencode immer wieder so genannte Stubs eingefugt durch die der kompilierte Code quasi Kontakt zur Aussenwelt aufnimmt Aktivieren des Kompilats BearbeitenGrundsatzlich kann die fertiggestellte Methode entweder zur Laufzeit des Bytecodes ausgetauscht oder aber zum Zeitpunkt des nachsten Aufrufs verwendet werden Das Unterbrechen einer laufenden Methode und Austauschen gegen die kompilierte Version nennt man On Stack Replacement OSR Um diese hochdynamische Operation zu bewerkstelligen werden im Bytecode so genannte Savepoints eingefugt An diesen Savepoints befindet sich die Virtual Machine in einem definierten synchronisierten Zustand Nun wird der Bytecode gegen das Kompilat getauscht und der genau entsprechende CPU Stack synthetisch erzeugt Literatur BearbeitenMichael Paleczny Christopher Vick Cliff Click The Java HotSpot server compiler In Proceedings of the Java Virtual Machine Research and Technology Symposium on Java Virtual Machine Research and Technology Symposium Volume 1 USENIX Association Monterey California 2001 acm org Alfred V Aho Ravi Sethi Jeffrey D Ullman Compiler Principles Techniques and Tools Addison Wesley Reading 1988 ISBN 0 201 10194 7 das Dragon Book Quellen Bearbeiten web archive org 27 April 1999 abgerufen am 2 November 2013 The hotspot Open Source Project on Open Hub Languages Page In Open Hub abgerufen am 18 Juli 2018 The Java HotSpot Performance Engine Architecture Abgerufen am 9 Juni 2020 The History of the Strongtalk Project von Dave Griswold Sun buys Java compiler technology based upon Self Keith Hankin 18 Februar 1997 Engineers to make significant contributions to Sun s Java Platform Memento vom 20 April 1999 im Internet Archive Mountain View 18 Februar 1997 Google Crankshaft inspired by Sun Java HotSpot Bak to adaptive compilation von Cade Metz 9 Dezember 2010 Language Based Virtual Machines or why speed matters Memento des Originals vom 23 September 2015 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot www aosd net von Lars BakWeblinks BearbeitenMichael Paleczny Christopher Vick Cliff Click The Java HotSpot Server Compiler Sun Microsystems PDF Datei 111 kB englisch Sun Barcelona Virtual Machine englisch Java Virtual Machine Specification englisch Java SE HotSpot at a Glance englisch Abgerufen von https de wikipedia org w index php title HotSpot amp oldid 236112185