Heim  >  Artikel  >  Java  >  Was sind die Phasen des JVM-Klassenladevorgangs?

Was sind die Phasen des JVM-Klassenladevorgangs?

青灯夜游
青灯夜游Original
2021-07-27 11:43:5513658Durchsuche

Klassenladevorgang: 1. Ladephase; 3. Vorbereitungsphase, die hauptsächlich Speicher zuweist und Klassenvariablen im Methodenbereich initialisiert; 5. Initialisierungsphase; In der Klassendatei deklarierte Variablen und statische Bereiche werden zusammengeführt, um die Cinit-Methode zu generieren und aufzurufen. 6. Verwendungsphase. 7. Deinstallationsphase.

Was sind die Phasen des JVM-Klassenladevorgangs?

Die Betriebsumgebung dieses Tutorials: Windows7-System, Java8-Version, DELL G3-Computer.

Um den Klassenladeprozess von JVM zu verstehen, müssen wir hauptsächlich zwei Fragen beantworten:

1 Wann wird die Klasse geladen?

2. Wie die Klasse geladen wird.

Was sind die Phasen des JVM-Klassenladevorgangs?

1. Bedingungen zum Auslösen des Klassenladens:

Der Klassenladeprozess ist hauptsächlich in sieben Phasen unterteilt: Laden, Überprüfung, Vorbereitung, Analyse, Initialisierung, Verwendung, Entladen; Laden, Überprüfung, Vorbereitung, Die Reihenfolge der fünf Prozesse zum Initialisieren und Entladen muss strikt eingehalten werden. JVM legt nicht den Zeitpunkt des Ladens der Klasse fest, schreibt jedoch strikt vor, dass die Klasse sofort initialisiert werden muss Das. .

1. Wenn Sie auf die vier Anweisungen new, getstatic, putstatic und invokestatic stoßen und die Klasse nicht initialisiert wurde, wird die Klasse zuerst initialisiert.

2. Wenn Sie die Methode des Pakets java.lang.reflect verwenden, um einen reflektierenden Aufruf an eine Klasse durchzuführen, wird ihre Initialisierung ausgelöst, wenn die Klasse nicht initialisiert wurde.

3. Wenn beim Initialisieren einer Klasse die übergeordnete Klasse der Klasse nicht initialisiert wurde, wird zuerst die Initialisierung ihrer übergeordneten Klasse ausgelöst.

4. Um die JVM auszuführen, müssen Sie eine Hauptklasse angeben, die die Hauptmethode enthält. Die virtuelle Maschine initialisiert diese Klasse.

5. Bei Verwendung der dynamischen Sprachunterstützung von Jdk1.7, wenn das endgültige Analyseergebnis einer java.lang.invoke.MethodHandle-Instanz das Methodenhandle von REF_getstatic, REF_putstatic, REF_inokestatic ist und die diesem Methodenhandle entsprechende Klasse hat nicht initialisiert, lösen Sie die Initialisierung dieser Klasse aus.

2. Klassenladeprozess

Der Klassenladeprozess ist hauptsächlich in sieben Phasen unterteilt: Laden, Überprüfung, Vorbereitung, Analyse, Initialisierung, Verwendung und Entladen.

1. Laden:

1) Laden Sie den einer Klasse entsprechenden Binärbyte-Stream über seinen vollständig qualifizierten Namen. Hauptsächlich durch Klassenlader implementiert.

2) Konvertieren Sie die durch den Bytestream dargestellte statische Speicherstruktur in die Laufzeitdatenstruktur des Methodenbereichs.

3) Generieren Sie ein java.lang.Class-Objekt, das diese Klasse im Speicher darstellt und als Eingang für jede Klasse im Methodenbereich dient, um auf diese Klasse zuzugreifen. (Hotspot generiert diese Klasse im Methodenbereich).

2. Überprüfung:

1), Überprüfung des Dateiformats: Überprüfen Sie, ob die magische Versionsnummernkonstante der Klassendatei innerhalb des von der aktuellen virtuellen Maschine unterstützten Bereichs liegt.

2), Metadatenüberprüfung: Überprüfen Sie, ob die semantischen Informationen der Klasse den Anforderungen der Java-Sprachspezifikation entsprechen.

3), Bytecode-Überprüfung: Stellen Sie sicher, dass die Programmsemantik legal und konform ist. Hauptsächlich durch die Stackmapframe-Struktur.

4) Überprüfung der Symbolreferenz: Die virtuelle Maschine wandelt die Symbolreferenz in eine direkte Referenz um und überprüft, ob die durch den vollständig qualifizierten Namen der Symbolreferenz dargestellte Klasse gefunden werden kann, ob die entsprechende Domäne und Methode gefunden werden kann und ob Die Zugangsberechtigung ist legal.

3. Vorbereitung:

Die Vorbereitungsphase besteht hauptsächlich darin, Speicher zuzuweisen und Klassenvariablen (modifiziert durch statische Modifikatoren) im Methodenbereich zu initialisieren.

Datentyp Nullwert Datentyp Nullwert
int 0 boolean false
long 0L float 0.0f
short 0 double 0.0d
char 'u0000' reference null
byte. 0

4. Parsing:

1) Klassen- oder Schnittstellenparsing: Konforme Referenzen in direkte Referenzen auf Klassen umwandeln und Zugriffsberechtigungen prüfen.

2) Feldanalyse: Konvertieren Sie die symbolische Referenz des Felds in die Klasseninformationen, zu der das Feld gehört, oder eine direkte Referenz auf das Feld seiner übergeordneten Klasse und überprüfen Sie die Zugriffsberechtigungen.

3) Parsen von Klassenmethoden: Konvertieren Sie die symbolische Referenz der Klassenmethode in die Klasseninformationen, zu denen die Klassenmethode gehört, oder in eine direkte Referenz auf das Feld ihrer übergeordneten Klasse und überprüfen Sie die Zugriffsberechtigungen.

4) Analyse der Schnittstellenmethode: Konvertieren Sie die symbolische Referenz der Schnittstellenmethode in die Schnittstelleninformationen, zu denen die Schnittstellenmethode gehört, oder in eine direkte Referenz auf das Feld ihrer übergeordneten Klasse und überprüfen Sie die Zugriffsberechtigungen.

5. Initialisierung:

In der Initialisierungsphase führt der Compiler die in der Klassendatei deklarierten statischen Zuweisungsvariablen und statischen Bereiche zusammen, um die Methode zu generieren.

Klassenlader: Ein Klassenlader ist eine Implementierung des „Ladens des binären Bytestroms einer Klasse über ihren vollständig qualifizierten Namen“. Für jede Klasse wird die virtuelle Eindeutigkeit gemeinsam vom Klassenlader und der Klasse selbst bestimmt Maschine.

Parentales Delegationsmodell:

Was sind die Phasen des JVM-Klassenladevorgangs?

1. Bootstrap ClassLoader startet den Klassenlader und ist für das Laden von /lib/rt.jar verantwortlich.

2. Die Erweiterung ClassLoader erweitert den Klassenlader und ist für das Laden verantwortlich Pakete unter /lib/ext

3. Der Anwendungsklassenlader ist für das Laden der JAVA-Klassenbibliothek unter dem CLASSPATH-Pfad verantwortlich.

4. Benutzer-Klassenlader Benutzerdefinierter Klassenlader.

Das übergeordnete Delegationsmodell lädt Klassen auf diese Weise: Wenn der Klassenlader eine Anforderung zum Laden einer Klasse erhält, delegiert er zunächst die übergeordnete Klasse, um die Klasse zu laden. Alle Klassenlader verwenden diese Methode, sodass alle Klassenladeanforderungen die Klasse erreichen Übergeordnete Klasse der obersten Ebene. Wenn die übergeordnete Klasse nicht geladen werden kann, verwenden Sie diesen Klassenlader, um sie zu laden. Auf diese Weise besteht eine hierarchische Beziehung zwischen den Klassenladern, die sicherstellen kann, dass die Basisklassen von Java von demselben Klassenlader geladen werden, was eine entscheidende Rolle für die Stabilität des Java-Systems spielt.

Empfehlungen für entsprechende Video-Tutorials: Java-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas sind die Phasen des JVM-Klassenladevorgangs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Welche Datei ist r.java?Nächster Artikel:Welche Datei ist r.java?