Im vorherigen Artikel haben wir Klassendateien erläutert. In diesem Artikel werden wir darüber sprechen, wie die virtuelle Maschine diese Klassendateien lädt. Was passiert mit den Informationen in der Klassendatei, nachdem sie in die virtuelle Maschine gelangt ist? Dies beinhaltet den Klassenlademechanismus.
Der Klassenlademechanismus besteht darin, die Klassendaten aus der Klassendatei in den Speicher zu laden, die Daten zu überprüfen, sie zu konvertieren, zu analysieren und zu initialisieren und schließlich einen Java-Typ zu bilden, der direkt von der virtuellen Maschine verwendet werden kann . Diese Reihe von Prozessen wird während der Ausführung des Programms abgeschlossen.
Klassenlader
Der Klassenlader ist der Teil im roten Feld in der Abbildung unten. Er ruft die Binärbytes ab, die diese Klasse über den vollständig qualifizierten Namen a beschreiben Klasse. Streamen, wodurch Java-Klassen dynamisch in den Speicherbereich der JVM geladen werden.
Anwendbare Szenarien
Für die Ladephase einer Nicht-Array-Klasse, Sie kann das System verwenden. Dies kann durch den bereitgestellten Boot-Klassenlader oder durch einen benutzerdefinierten Klassenlader erfolgen.
Array-Klassen werden direkt von der Java Virtual Machine erstellt, ohne den Klassenlader zu durchlaufen.
Elterndelegierungsmechanismus
Der elterliche Delegationsmechanismus ist eine Methode, die beim Laden von Klassen verwendet wird. Wenn ein Klassenlader eine Klassenladeanforderung erhält, versucht er nicht, zuerst die Klasse selbst zu laden, sondern delegiert die Anforderung zur Vervollständigung an den übergeordneten Klassenlader. Dies gilt für jede Ebene des Klassenladers. Erst wenn der übergeordnete Loader meldet, dass er die Anforderung nicht abschließen kann, versucht der untergeordnete Loader, sie selbst zu laden.
Analogie zur Realität: Xiao Ming möchte einen Spielzeugbagger kaufen, aber es ist ihm zu peinlich, es direkt zu sagen. Es kam also zu folgendem Gespräch.
Xiao Ming fragte seinen Vater: Papa, hast du einen Bagger?
Papa sagte: Nein
Dann fragte Papa Opa: Papa, Papa, hast du einen Bagger?
Opa sagte: Nein
Dann fragte Opa Ur-Opa: Papa, Papa, hast du einen Bagger?
Opa sagte: Ich auch nicht. Lassen Sie Ihren Urenkel eines kaufen.
Daher kaufte sich Xiao Ming voller Freude selbst einen Spielzeugbagger.
Kategorie
Der Startup-Klassenlader ist in C++ implementiert und Teil der virtuellen Maschine selbst.
Andere Klassenlader werden unabhängig von der virtuellen Maschine in der Java-Sprache implementiert und erben alle von der abstrakten Klasse java.lang.ClassLoader.
Vorteile
Nehmen Sie die String-Klasse als Beispiel. Selbst wenn der Benutzer selbst eine Implementierung der String-Klasse schreibt, wird diese beim Laden dieser Klasse nur an den Startklassenlader delegiert, um die ursprüngliche String-Klasse im JDK zu laden, und die benutzerdefinierte String-Klasse wird niemals geladen. Dies gewährleistet die Sicherheit des Systems.
Wann wird das Klassenladen durchgeführt?
Es gibt nur die folgenden 5 Möglichkeiten, eine Klasse sofort zu laden
(1) Bei Verwendung von new zum Instanziieren eines Objekts das Lesen oder Konfigurieren der statischen Felder einer Klasse (geändert durch final, bereits kompiliert ( außer wenn das Ergebnis in das statische Feld des Konstantenpools gestellt wird); beim Aufruf einer statischen Methode einer Klasse.
(2) Bei Verwendung der Methode des Pakets java.lang.reflect, um einen reflektierenden Aufruf an die Klasse durchzuführen. Wenn die Klasse nicht initialisiert wurde, muss ihre Initialisierung zuerst ausgelöst werden.
(3) Wenn beim Initialisieren einer Klasse festgestellt wird, dass die übergeordnete Klasse nicht initialisiert wurde, müssen Sie zuerst die Initialisierung der übergeordneten Klasse auslösen.
(4) Beim Start der virtuellen Maschine muss der Benutzer eine auszuführende Hauptklasse angeben (die Klasse, die die Methode main() enthält. Die virtuelle Maschine initialisiert zuerst die Hauptklasse
Details zum Klassenladevorgang
Der Klassenladevorgang ist in 5 Schritte unterteilt. Die meisten von ihnen werden von der virtuellen Maschine dominiert und gesteuert, mit Ausnahme der folgenden zwei Situationen: In der LadephaseEntwickler können über einen benutzerdefinierten Klassenlader teilnehmenIn In der Initialisierungsphase wird der Code des Entwicklers ausgeführt, um Klassenvariablen und andere Ressourcen zu initialisieren1. Laden
Dinge, die die virtuelle Maschine ausführen muss: (1) Erhalten Sie den binären Bytestrom, der diese Klasse definiert, über den vollständig qualifizierten Namen einer Klasse.
(2) Konvertieren Sie die durch diesen Bytestream dargestellte statische Speicherstruktur in die Laufzeitdatenstruktur des Methodenbereichs.
(3) Generieren Sie ein java.lang.Class-Objekt, das diese Klasse im Speicher darstellt, als Zugriffseintrag für verschiedene Daten dieser Klasse im Methodenbereich.
2. Verifizierung
Der Zweck der Verifizierung besteht darin, dies sicherzustellen Die im Bytestream enthaltenen Informationen der Klassendatei erfüllen die Anforderungen der aktuellen virtuellen Maschine und gefährden nicht die Sicherheit der virtuellen Maschine selbst.Es ist in 4 Schritte unterteilt: Überprüfung des Dateiformats, Überprüfung der Metadaten, Überprüfung des Bytecodes und Überprüfung der Symbolreferenz. Unter diesen erfolgt die Überprüfung des Dateiformats direkt am Bytestream, und die verbleibenden drei Elemente werden im Methodenbereich ausgeführt.
3. Vorbereitung
In dieser Phase wird formal Speicher für Klassenvariablen zugewiesen und der Anfangswert von Klassenvariablen festgelegt. Es wird im Methodenbereich zugewiesen. Es sind zwei Punkte zu beachten: (1) Derzeit wird nur Klassenvariablen (durch statische Variablen geänderte Variablen) Speicher zugewiesen, nicht Objektvariablen. Speicher wird einem Objekt zugewiesen, wenn das Objekt instanziiert wird, und wird zusammen mit dem Objekt dem Java-Heap zugewiesen. (2) Wenn eine Klassenvariable nicht durch final geändert wird, ist ihr Anfangswert der Nullwert des Datentyps. Der int-Typ ist beispielsweise 0 und der boolesche Typ ist false. Ein Beispiel zur Veranschaulichung: Der Anfangswert vonpublic static int value=123;
public static final int value=123;
4. Parsen
Die Parsing-Phase ist der Prozess, in dem die virtuelle Maschine Symbolreferenzen im Konstantenpool durch direkte ersetzt Referenzen. Klassen oder Schnittstellen, Felder, Klassenmethoden, Schnittstellenmethoden usw. können analysiert werden.
Was ist eine symbolische Referenz:
Eine symbolische Referenz ist eine Zeichenfolge, die Klasseninformationen, Methodennamen, Methodenparameter und andere Informationen enthält. Sie wird in der Methodentabelle der Klasse verwendet für den tatsächlichen Gebrauch. Finden Sie die entsprechende Methode.
Was ist eine direkte Referenz:
Eine direkte Referenz ist ein Offset, der direkt im Speicherbereich des zu finden ist Klasse Die Startposition des Methodenbytecodes.
Die Symbolreferenz zeigt Ihnen einige Merkmale dieser Methode. Sie müssen diese Merkmale verwenden, um die entsprechende Methode zu finden. Direktes Zitat bedeutet, Ihnen direkt zu sagen, wo diese Methode ist.
5. Initialisierung
Diese Stufe wird zum Initialisieren von Klassenvariablen und anderen Ressourcen verwendet und ist der Ausführungsklassenkonstruktor
Das Obige ist eine detaillierte Erklärung des JAVA-Klassenlademechanismus. Weitere verwandte Fragen finden Sie auf der chinesischen PHP-Website: JAVA-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!