<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=HotSpot</id>
	<title>HotSpot - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=HotSpot"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=HotSpot&amp;action=history"/>
	<updated>2026-05-31T16:57:45Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=HotSpot&amp;diff=66017&amp;oldid=prev</id>
		<title>imported&gt;Jule Glühwurm: /* growthexperiments-addlink-summary-summary:2|0|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=HotSpot&amp;diff=66017&amp;oldid=prev"/>
		<updated>2025-03-20T13:47:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|0|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Dieser Artikel|behandelt eine Java Virtual Machine; zu weiteren Bedeutungen siehe [[Hot Spot]].}}&lt;br /&gt;
{{Infobox Software&lt;br /&gt;
| Logo                          = &lt;br /&gt;
| Screenshot                    = &lt;br /&gt;
| Beschreibung                  = &amp;lt;!-- Beschreibung des Screenshots! --&amp;gt;&lt;br /&gt;
| Maintainer                    = [[Oracle]]&lt;br /&gt;
| Hersteller                    = [[Oracle]]&lt;br /&gt;
| Management                    = &lt;br /&gt;
| AktuelleVersion               = 22&lt;br /&gt;
| AktuelleVersionFreigabeDatum  = 12. Dezember 2011&lt;br /&gt;
| AktuelleVorabVersion          = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Betriebssystem                = [[plattformübergreifend]]&lt;br /&gt;
| Programmiersprache            = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Kategorie                     = [[Java Virtual Machine]]&lt;br /&gt;
| Lizenz                        = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Deutsch                       = &lt;br /&gt;
| Website                       = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;HotSpot&amp;#039;&amp;#039;&amp;#039; ist eine unter dem Namen &amp;#039;&amp;#039;&amp;#039;Java HotSpot Performance Engine&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.oracle.com/technetwork/java/whitepaper-135217.html |titel=The Java HotSpot Performance Engine Architecture |abruf=2020-06-09}}&amp;lt;/ref&amp;gt; veröffentlichte, sehr weit verbreitete [[Java Virtual Machine]] von [[Oracle]] (vorher von [[Sun Microsystems]]) für [[Arbeitsplatzrechner]] und Server. Sie basiert auf Techniken wie [[Just-in-time-Kompilierung]] und [[Adaptive Optimierung|adaptiver Optimierung]], um das Laufzeitverhalten von Software während der Ausführung zu verbessern.&lt;br /&gt;
&lt;br /&gt;
== Entstehungsgeschichte ==&lt;br /&gt;
&lt;br /&gt;
Der Ursprung von HotSpot geht auf eine Gruppe von Programmierern zurück, die Anfang der 1990er-Jahre bei [[Sun Microsystems]] an der Programmiersprache [[Self (Programmiersprache)|Self]] gearbeitet hatten. Diese Programmierer [[Lars Bak (Informatiker)|Lars Bak]], [[Gilad Bracha]], &amp;#039;&amp;#039;Steffen Grarup&amp;#039;&amp;#039;, &amp;#039;&amp;#039;David Griswold&amp;#039;&amp;#039;, [[Robert Griesemer]] und [[Urs Hölzle]] verließen 1994 Sun und gründeten gemeinsam eine Firma namens &amp;#039;&amp;#039;Longview Technologies&amp;#039;&amp;#039;, die auch unter dem Namen &amp;#039;&amp;#039;Animorphic Systems&amp;#039;&amp;#039; auftrat, um dort die auf [[Smalltalk (Programmiersprache)]] basierte [[Optionale Typisierung|optional typisierte]] Programmiersprache [[Strongtalk]] zu entwickeln. Dort gelang Urs Hölzle die Entwicklung eines Type-Feedback-Compilers, und auch die Strongtalk-[[Virtuelle Maschine|VM]] machte große Fortschritte.&amp;lt;ref name=&amp;quot;ST-History&amp;quot;&amp;gt;[http://strongtalk.org/history.html The History of the Strongtalk Project] von Dave Griswold.&amp;lt;/ref&amp;gt; Aufgrund der stürmischen Entwicklung der neuen von Sun herausgebrachten Programmiersprache [[Java (Programmiersprache)|Java]] entschloss man sich eine grundlegend neue [[Java Virtual Machine]] zu entwickeln. In dieser Zeit wurde Srdjan Mitrovic aufgenommen, der für die Integration von Java in die neue VM sorgte. 1997 kaufte Sun&amp;lt;ref&amp;gt;[http://www.merlintec.com/old-self-interest/msg01011.html Sun buys Java compiler technology based upon Self!!!] Keith Hankin 18. Februar 1997&amp;lt;/ref&amp;gt; Longview Technologies&amp;lt;ref&amp;gt;{{Webarchiv |url=http://java.sun.com/pr/1997/feb/pr970218-01.html |text=Engineers to make significant contributions to Sun&amp;#039;s Java Platform |wayback=19990420194046}}, [[Mountain View (Santa Clara County, Kalifornien)|Mountain View]] 18. Februar 1997&amp;lt;/ref&amp;gt; und Lars Bak wurde führender Ingenieur der Hotspot-VM bei Sun. Zum Zeitpunkt der Übernahme war HotSpot rund doppelt so schnell wie damals am Markt befindliche JVMs.&amp;lt;ref&amp;gt;[http://www.theregister.co.uk/2010/12/09/google_crankshaft_and_sun_java_hotspot/ Google &amp;#039;Crankshaft&amp;#039; inspired by Sun Java HotSpot – Bak to &amp;#039;adaptive compilation&amp;#039;] von Cade Metz, 9. Dezember 2010&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Webarchiv |url=http://www.aosd.net/2012/images/stories/bak.pdf |text=Language Based Virtual Machines … or why speed matters |wayback=20150923172541 |archiv-bot=}} von Lars Bak&amp;lt;/ref&amp;gt;&lt;br /&gt;
Sun Microsystems seinerseits wurde 2010 von [[Oracle]] übernommen.&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
Der Sun Java Server (auch Opto oder C2) [[Compiler]] verwandelt den [[Java (Programmiersprache)|Java]] [[Bytecode]] der [[Java Virtual Machine]] (JVM) in ausführbaren Maschinencode der entsprechenden Zielplattform. Es handelt sich um einen hochoptimierenden [[Just-in-time-Kompilierung|Just-in-time-Compiler]] (JIT). Just-in-time-Compiler erzeugen den Maschinencode im Gegensatz zu [[Ahead-of-time-Compiler]]n wie beispielsweise [[GNU Compiler Collection|GCC]] erst zur Laufzeit des Programms. Damit schlägt der Übersetzungsvorgang selbst, neben der eigentlichen Laufzeit des Programms, in Form von [[Hauptprozessor|CPU]]-Zyklen und längerer Laufzeit zu Buche. Da dieser (Kompilier-)Vorgang allerdings nur adaptiv, das heißt bei einigen [[Methode (Programmierung)|Methoden]] (so genannten Hotspots) angewandt wird, dieser Aufwand einmalig und insbesondere bei langlaufenden Serveranwendungen sehr kurz verglichen mit der Programm-Ausführungszeit ist, wird dieser Mehraufwand schnell durch die höhere Qualität des erzeugten Maschinencodes kompensiert. Außerdem erfolgt die Kompilierung in einem gesonderten &amp;#039;&amp;#039;[[Thread (Informatik)|Thread]]&amp;#039;&amp;#039;, der auf [[Symmetrisches Multiprozessorsystem|SMP]]-Maschinen normalerweise auf einer gesonderten CPU ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Zu Beginn der Laufzeit eines [[Java (Programmiersprache)|Java]]-Programms wird der gesamte Bytecode ausschließlich interpretiert. Das geschieht in einer Interpreterschleife, die Bytecode für Bytecode abarbeitet. Die Besonderheit von Hotspot-Compilern liegt nun darin, nur häufig benutzte Codeabschnitte – so genannte „Hotspots“ – sukzessive in [[Maschinencode]] zu übersetzen. Die Hotspots werden unter anderem auch lokal, das heißt innerhalb von Methoden, entdeckt, die kleinste Kompiliereinheit ist aber in jedem Fall die Methode. Da die Übersetzung nur bei besonders häufig genutzten oder langlaufenden Methoden und nicht mit dem gesamten Code geschieht, ist der Mehraufwand speziell bei langlaufenden Anwendungen vernachlässigbar.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieses Verfahrens liegt in der Möglichkeit, &amp;#039;&amp;#039;Closed-world-Optimierungen&amp;#039;&amp;#039; durchzuführen sowie [[Dynamische Optimierung]]en anwenden zu können.&lt;br /&gt;
Dies bedeutet, dass die JVM immer den gesamten geladenen Bytecode kennt und anhand dessen Optimierungsentscheidungen treffen kann, welche die [[Semantik]] des Codes so verändern, dass dieser nur mehr unter den vorhandenen Einsatzbedingungen korrekt funktioniert.&lt;br /&gt;
Wird zur Laufzeit Code geladen, welcher diese Einsatzbedingungen ändert, so führt die (Server-)Hotspot-VM eine Deoptimierung durch – und garantiert somit die korrekte Funktion, indem es den für diesen Einsatz zu aggressiv optimierten Code entfernt und erneut optimiert.&lt;br /&gt;
&lt;br /&gt;
Der Kompiliervorgang des Sun-Hotspot-Compilers setzt sich aus den folgenden Schritten zusammen:&lt;br /&gt;
&lt;br /&gt;
== Hotspot-Erkennung, Compile Policy ==&lt;br /&gt;
Das grundsätzliche Verfahren, wie und unter welchen Umständen eine Methode übersetzt wird, wird in der Sun JVM durch so genannte &amp;#039;&amp;#039;CompilePolicies&amp;#039;&amp;#039; definiert. Diese in einer C++-Klassenhierarchie modellierten Richtlinien sind im Fall des Server-Compilers in der Klasse &amp;lt;code&amp;gt;StackWalkCompPolicy&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;-XX:+CompileTheWorld&amp;lt;/code&amp;gt; zum Übersetzen buchstäblich &amp;#039;&amp;#039;aller&amp;#039;&amp;#039; Methoden einmal abgesehen. Der Name StackWalkCompPolicy geht auf den [[Algorithmus]] zurück, den Aufrufstack der zu untersuchenden Methoden solange nach oben zu prüfen, bis die erste Methode entdeckt wird, die nicht mehr zu einem Inlining führen wird.&lt;br /&gt;
&lt;br /&gt;
Im Servercompiler werden zur Erkennung der Hotspots zwei Schwellwerte herangezogen:&lt;br /&gt;
;Aufrufhäufigkeit einer Methode: Dieser Schwellwert wird in der JVM-internen [[Variable (Programmierung)|Variable]] &amp;#039;&amp;#039;CompileThreshold&amp;#039;&amp;#039; gehalten und hat auf den verschiedenen Plattformen unterschiedliche Grundeinstellungen. Auf der [[IA-32|Intel-386-Architektur]] sind es bei der Server-JVM 10.000 und bei der Client-JVM 1.500 Methodenaufrufe.&lt;br /&gt;
;Anzahl von Schleifendurchläufen in einer Methode: Werden Schleifen in Methoden allzu häufig durchlaufen, markiert dies eine Methode ebenfalls zur Kompilierung. Die Häufigkeit eines Schleifendurchlaufs wiederum wird in so genannten &amp;#039;&amp;#039;Backedge-Countern&amp;#039;&amp;#039; für jede Schleife einzeln mitgezählt.&lt;br /&gt;
&lt;br /&gt;
Im Servercompiler befinden sich bereits Vorkehrungen, in späteren Versionen eine so genannte Two-tier-Kompilierung zu unterstützen. Dabei geht es darum, eine Methode zuerst zügig und ohne massive Optimierung zu kompilieren und später (oder parallel) in einem weiteren Durchlauf hochoptimiert zu übersetzen. Diese „two tier compilation“ wird perspektivisch zu einer Verschmelzung von Server und Client-[[Compiler]] führen.&lt;br /&gt;
&lt;br /&gt;
== Kompilierung ==&lt;br /&gt;
Nachdem die Policy-Steuerung einzelne Methoden nun zum Kompilieren markiert hat, wird für jede der Methoden ein &amp;lt;code&amp;gt;CompileTask&amp;lt;/code&amp;gt; Object erzeugt und in die &amp;lt;code&amp;gt;CompileQueue&amp;lt;/code&amp;gt; eingereiht. Das, sowie die sonstige Kontrolle des gesamten Übersetzungsvorgangs, obliegt dem &amp;lt;code&amp;gt;CompileBroker&amp;lt;/code&amp;gt;. Dieser erzeugt die einzelnen Übersetzungsjobs (&amp;lt;code&amp;gt;CompileTask&amp;lt;/code&amp;gt;), stellt sie in die Queue und weckt zuletzt mit einem &amp;lt;code&amp;gt;notify()&amp;lt;/code&amp;gt; inaktive Compile Threads. Die Anzahl der Compile [[Thread (Informatik)|Threads]] ist im Normalfall log(Anzahl der CPUs), doch mindestens zwei. Im CompileBroker werden auch diverse &amp;lt;code&amp;gt;PerfCounter&amp;lt;/code&amp;gt;-Objekte gehalten, die zur späteren Leistungsüberwachung beziehungsweise -anzeige herangezogen werden können.&lt;br /&gt;
&lt;br /&gt;
Nun wird der Bytecode in verschiedenen Phasen umgewandelt. Die wichtigsten Schritte sind hierbei:&lt;br /&gt;
* Parsen des Bytecodes&lt;br /&gt;
* Löschen ungenutzter Knoten (&amp;#039;&amp;#039;nodes&amp;#039;&amp;#039;)&lt;br /&gt;
* Auswählen der Instruktionen.&lt;br /&gt;
* &amp;#039;&amp;#039;Global Value Numbering&amp;#039;&amp;#039; (GVN)&lt;br /&gt;
* &amp;#039;&amp;#039;Control Flow Graph&amp;#039;&amp;#039; (CFG) erzeugen&lt;br /&gt;
* [[Register Allocation]] ([[Chaitin Graph Coloring]])&lt;br /&gt;
* Peephole-Optimierung&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;Internal Representation&amp;#039;&amp;#039; (IR) des Programmlaufs wird im [[Static Single Assignment|SSA]]-Format gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Optimierung ==&lt;br /&gt;
Unter anderem durch die Speicherung des Knoten-Graphs im SSA-Format ist es möglich, eine Reihe von Optimierungsverfahren anzuwenden. Hier die wichtigsten:&lt;br /&gt;
&lt;br /&gt;
;Inlining: Kurze Methoden (maximal 35 [[Byte]]s) werden in den Rumpf des Aufrufers eingefügt, anstatt angesprungen zu werden. Bei längeren Methoden rentiert sich Inlining nicht.&lt;br /&gt;
&lt;br /&gt;
;Loop-Unrolling: Kurze Schleifen werden sozusagen „entrollt“, das heißt, die einzelnen Schleifendurchläufe werden sequenziell ohne Rücksprung abgearbeitet. Das vergrößert ähnlich dem Inlining den Speicherverbrauch, ist aber bei wenigen Schleifendurchläufen billiger als das ständige Testen einer Sprungbedingung.&lt;br /&gt;
&lt;br /&gt;
;Dead Code Elimination: Ungenutzte Anweisungen werden auf Bytecodeebene entdeckt und verworfen. Obwohl diese Optimierung auf Quellcodeebene durch den &amp;#039;&amp;#039;[[Java (Programmiersprache)|Java]] Frontend Compiler&amp;#039;&amp;#039; (javac) weit mehr Anwendung findet, wird dieser Schritt auch auf Bytecodeebene angewendet.&lt;br /&gt;
&lt;br /&gt;
;Peephole-Optimierung: Optimierung auf Assemblerebene. Hierbei wird ein Kontext (&amp;#039;&amp;#039;peephole&amp;#039;&amp;#039;) über einige wenige Assembler-Instruktionen erzeugt und zum Beispiel redundante Speicherzugriffe eliminiert und Registerzugriffe optimiert.&lt;br /&gt;
&lt;br /&gt;
== Codegenerierung, Aktivierung ==&lt;br /&gt;
=== AD-Dateien ===&lt;br /&gt;
Der [[Codegenerator]] (Emitter) des Systems erzeugt [[Maschinencode]] auf der Basis von vorgefertigten Schablonen, die zu dem Bytecode korrespondierende Assemblercodestrecken in so genannten &amp;#039;&amp;#039;Architecture Description Files&amp;#039;&amp;#039; (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 übersetzt, die in den VM-Buildprozess einfließen.&lt;br /&gt;
&lt;br /&gt;
=== CompileCache ===&lt;br /&gt;
Die von dem Compiler erstellten [[Assemblersprache]]-Instruktionen werden im &amp;lt;code&amp;gt;CompilerCache&amp;lt;/code&amp;gt; mit einer Referenz auf den ursprünglichen Bytecode abgelegt. Das ist notwendig, um bei einer späteren Deoptimierung wieder auf den Bytecode zugreifen zu können. Deoptimierung kann nötig werden, wenn etwa dynamisch geladene Klassen, in denen einzelnen Methoden eingebettet wurden (&amp;#039;&amp;#039;Inlining&amp;#039;&amp;#039;), zur Laufzeit durch neue ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Stubs ===&lt;br /&gt;
Der durch den Kompiliervorgang erzeugte Maschinencode kann ohne Inanspruchnahme von Services der VM nicht funktionieren. In einer Methode muss zum Beispiel immer wieder ein &amp;#039;&amp;#039;name lookup&amp;#039;&amp;#039; in der Symboltabelle vorgenommen, eine Referenz aufgelöst oder andere Dienstleistungen der JVM in Anspruch genommen werden. Deswegen werden in den Maschinencode immer wieder so genannte [[Stub (Programmierung)|Stubs]] eingefügt, durch die der kompilierte Code quasi Kontakt zur Außenwelt aufnimmt.&lt;br /&gt;
&lt;br /&gt;
== Aktivieren des Kompilats ==&lt;br /&gt;
Grundsätzlich kann die fertiggestellte Methode entweder zur Laufzeit des Bytecodes ausgetauscht oder aber zum Zeitpunkt des nächsten 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 eingefügt. An diesen Savepoints befindet sich die &amp;#039;&amp;#039;Virtual Machine&amp;#039;&amp;#039; in einem definierten, synchronisierten Zustand. Nun wird der [[Bytecode]] gegen das Kompilat getauscht und der genau entsprechende CPU-Stack synthetisch erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Michael Paleczny, Christopher Vick, Cliff Click&lt;br /&gt;
   |Titel=The Java HotSpot server compiler&lt;br /&gt;
   |Sammelwerk=Proceedings of the Java Virtual Machine Research and Technology Symposium on Java Virtual Machine Research and Technology Symposium&lt;br /&gt;
   |Band=Vol. 1&lt;br /&gt;
   |Verlag=USENIX Association&lt;br /&gt;
   |Ort=Monterey, California&lt;br /&gt;
   |Datum=2001&lt;br /&gt;
   |Online=http://portal.acm.org/citation.cfm?id=1267848}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman&lt;br /&gt;
   |Titel=Compiler. Principles, Techniques, and Tools.&lt;br /&gt;
   |Verlag=Addison-Wesley&lt;br /&gt;
   |Ort=Reading&lt;br /&gt;
   |Datum=1988&lt;br /&gt;
   |ISBN=0-201-10194-7&lt;br /&gt;
   |Kommentar=das „Dragon Book“}}&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Michael Paleczny, Christopher Vick, Cliff Click: &amp;#039;&amp;#039;[http://www.usenix.org/events/jvm01/full_papers/paleczny/paleczny.pdf The Java HotSpot Server Compiler.]&amp;#039;&amp;#039; Sun Microsystems (PDF-Datei, 111&amp;amp;nbsp;kB, englisch)&lt;br /&gt;
* [http://labs.oracle.com/projects/barcelona/ Sun Barcelona Virtual Machine] (englisch)&lt;br /&gt;
* [http://docs.oracle.com/javase/specs/jvms/se5.0/html/VMSpecTOC.doc.html Java Virtual Machine Specification] (englisch)&lt;br /&gt;
* [http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html Java SE HotSpot at a Glance] (englisch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java-Programmierwerkzeug]]&lt;br /&gt;
[[Kategorie:Virtuelle Maschine]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Jule Glühwurm</name></author>
	</entry>
</feed>