Heim  >  Artikel  >  Java  >  Detaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus

Detaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus

王林
王林nach vorne
2019-08-24 15:14:062844Durchsuche

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.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus

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.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus

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 Ladephase

Entwickler können über einen benutzerdefinierten Klassenlader teilnehmen

In In der Initialisierungsphase

wird der Code des Entwicklers ausgeführt, um Klassenvariablen und andere Ressourcen zu initialisieren

1. 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.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (5) – Klassenlademechanismus

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 von

public static int value=123;

nach der Vorbereitungsphase ist 0 statt 123, da zu diesem Zeitpunkt noch keine Java-Methode ausgeführt wurde und die putstatic-Anweisung, die 123 den Wert zuweist, nach dem Programm liegt wird kompiliert und in der Klassenkonstruktormethode
public static final int value=123;
Da der Wert zu diesem Zeitpunkt endgültig ist, wurde ihm in der Vorbereitungsphase der Wert 123 zugewiesen.

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen