Der Prozess des Ladens der JVM-Klasse ist in drei Schritte unterteilt: Laden, Verbinden und Initialisieren.
Laden
Laden Sie diese Klasse von außen in die JVM über den gesamten Pfad der Klasse und bei gleichzeitig im Methodenbereich Generieren Sie die Beschreibungsinformationen der Klasse und generieren Sie den Claas-Typ der Klasse im Speicher. Als Datenzugriffseintrag dieser Klasse im Methodenbereich.
Verbinden
Dies ist ein sehr wichtiger Schritt. Der Prozess ist recht kompliziert und gliedert sich in drei Schritte: Überprüfung, Vorbereitung und Analyse.
Überprüfung: Stellen Sie sicher, dass die Klasse korrekt geladen wird. Im Allgemeinen gibt es kein Problem mit von Javac kompilierten Klassendateien, aber einige Leute können die Klassendateien selbst mit anderen Methoden kompilieren, was möglicherweise nicht den JVM-Kompilierungsregeln entspricht. Dieser Schritt besteht darin, diesen Teil herauszufiltern
Vorbereitung: Reservieren Sie Speicher für statische Variablen der Klasse und initialisieren Sie sie mit Standardwerten. Wir alle wissen, dass statischen Variablen manuell Werte zugewiesen werden können. Sie haben beispielsweise einen Anfangswert vom Typ int und sind falsch Der Wert des Referenztyps ist null. Beachten Sie hier, dass nur Speicher für statische Variablen reserviert ist und derzeit keine Objektinstanz vorhanden ist.
Analyse: Konvertieren Sie Symbolreferenzen in der Klasse in direkte Referenzen. Erklären Sie symbolische Verweise und direkte Verweise. Wenn Sie beispielsweise Methode B in Methode A verwenden, ist A(){B();}, B() hier eine symbolische Referenz. Als wir Java zum ersten Mal lernten, wussten wir alle, dass dies eine Referenz auf Java war, und dachten, dass B zeigt auf die Speicheradresse der Methode B. Dies ist jedoch nur eine symbolische Referenz. Es hat keine große praktische Bedeutung für den Aufruf der Methode Wissen Sie, dass diese Methode so sein kann Rufen Sie an, aber wenn Methode B tatsächlich aufgerufen wird, zeigt sie über einen Zeiger auf die Speicheradresse von Methode B. Dieser Zeiger ist tatsächlich für den Methodenaufruf verantwortlich und stellt eine direkte Referenz dar.
Initialisierung
In der Initialisierungsphase wird die Initialisierungsmethode clinit() der Klasse aufgerufen, um statischen Variablen tatsächliche Werte zuzuweisen (z. B. „assign“) Wert auf 123 setzen) und statisches Codestück ausführen. In der JVM-Spezifikation gibt es keine zwingende Einschränkung für den Zeitpunkt des Ladens. Für die Initialisierung schreibt die JVM-Spezifikation jedoch strikt vor, dass es nur 5 Situationen gibt, in denen eine Klasse sofort initialisiert werden muss:
Lassen Sie uns erklären, wie das funktioniert Die Methode clinit() wird generiert. Die Methode clinit() wird vom Compiler generiert und sammelt automatisch statische Variablen und statische Anweisungen in der Klasse. Die Reihenfolge, in der der Compiler sammelt, wird durch die Reihenfolge bestimmt, in der Anweisungen angezeigt werden. Ein statischer Anweisungsblock kann nur die nach ihm definierten Variablen kopieren, sie jedoch nicht verwenden, wie in der folgenden Abbildung dargestellt, und die Spezifikation der virtuellen Maschine garantiert, dass die Clinit ()-Methode der übergeordneten Klasse Muss vor Unterklassen ausgeführt werden, jedoch nicht durch Vererbung.
Das obige ist der detaillierte Inhalt vonWie läuft das Laden der JVM-Klasse ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!