Java Virtual Machine - Leitfaden zur Architektur von JVM mit seiner Komponente

Inhaltsverzeichnis:

Anonim

Einführung in Java Virtual Machine

In diesem Artikel erfahren Sie mehr über Java Virtual Machine, auch bekannt als „JVM“. Java Virtual Machine ist eine virtuelle Maschine, mit der ein Computersystem Java-Programme ausführen kann. Grundsätzlich ist JVM eine Engine, die als Laufzeitumgebung für Java-Code fungiert. JVM konvertiert den Java-Code in Maschinensprache. Wenn Sie eine kompilierte .class-Datei ausführen, wird diese an JVM übergeben und anschließend von JVM die Ausgabe zurückgegeben. Java Virtual Machine ist ein Teil von JRE, das für "Java Runtime Environment" steht. Grundlegende Aufgaben für eine Java Virtual Machine bestehen darin, den Code zu laden, dann den Code zu überprüfen und den Code auszuführen. Stellen Sie außerdem die Laufzeitumgebung für die Codeausführung bereit. JVM besteht aus verschiedenen Komponenten wie Classloader, einer von JVM zugewiesenen Speicherplatzliste wie Stack, einer Execution Engine und einigen nativen Bibliotheken.

Die Architektur der Java Virtual Machine

Wie in der obigen Abbildung dargestellt, besteht die Java Virtual Machine Architecture aus verschiedenen Komponenten. Lernen wir jede einzelne Komponente kennen.

Lader

Wie der Name schon sagt, handelt es sich um eine Komponente, die für das Laden von Klassendateien verantwortlich ist. Laden, Verknüpfen und Initialisieren einer Klassendatei sind die Hauptfunktionen des Loader. Der Loader arbeitet zur Laufzeit.

  • Laden: Grundsätzlich liest der Loader die .class-Datei, generiert dann den Binärcode und speichert ihn in einem Methodenbereich. Bootstrap Classloader, Extension Classloader und Application Classloader sind die verschiedenen ClassLoader, die für das Laden verschiedener Klassen verantwortlich sind.
  • Verknüpfen: Drei Hauptfunktionen wie Überprüfen, Vorbereiten und Lösen. Es beginnt mit der Überprüfung der .class-Datei. Wenn die Überprüfung fehlschlägt, gibt es eine Laufzeitüberprüfungsausnahme. Später wird den Variablen Speicher mit Standardwerten zugewiesen. Schließlich werden die symbolischen Speicherreferenzen durch direkte Referenzen aus dem Speicherbereich ersetzt.
  • Initialisierung: Dies ist ein letzter Teil von ClassLoader. Die ursprünglichen Werte werden allen statischen Variablen zugewiesen, gefolgt von der Ausführung des statischen Blocks. Dieser Teil wird von oben nach unten in einer Klasse ausgeführt.

Haufen

Hier werden alle Details eines Objekts und der Instanzvariablen gespeichert. Es handelt sich um einen gemeinsamen Speicherbereich, dh die hier gespeicherten Daten sind nicht threadsicher.

Ausnahme im Thread "main" java.lang.OutOfMemoryError: Java-Heapspeicher

Einer der am besten zuzuordnenden Fehler ist die Ausnahme "OutOfMemoryError". Dies bedeutet, dass die JVM kein Objekt im Heap-Bereich zuordnen kann oder dass die Speicherzuordnung nicht für dasselbe Objekt erfolgen kann.

Stapel

Hier wird für jeden neuen Thread ein separater Runtime-Stack angelegt. Wird auch als Run-Time-Stack bezeichnet. Jedes Mal, wenn eine Methode aufgerufen wird, werden alle Details im entsprechenden Runtime-Stand gespeichert und nach Abschluss der Methode aus dem Stack entfernt.

PC-Register

Für jeden einzelnen Thread wird ein separates PC-Register (Programmzähler) erstellt, in dem die Adresse des aktuellen Ausführungsbefehls gespeichert wird, der später mit dem nächsten Befehl aktualisiert wird. Dieser Speicherbereich ist ziemlich klein und hat eine feste Größe.

Native Method Stack

Es ist eine eigene Art von Speicherbereich, der von einem Thread aufgerufen wird, und dann befindet sich der Thread auf einer völlig neuen Ebene, auf der die von Java Virtual Machine implizierten Struktur- und Sicherheitsbeschränkungen nicht mehr ausgeführt werden. Im Vergleich zu anderen Laufzeitspeicherbereichen hat der Speicher, der von den nativen Methodenstapeln belegt wird, keine feste Größe, und es bestehen keine Einschränkungen hinsichtlich des Inkrements oder Dekrements.

Java Native Interface

JNI interagiert einfach mit den unten genannten Native Method Libraries, die C, C ++ implementieren und das gleiche für die Ausführungs-Engine bereitstellen. Der direkte Zugriff auf Assembler-Code wird von JNI zugelassen. Bei einer JVM sind Java und Native die beiden Codetypen. Das JNI stellt reibungslos eine klar definierte Verbindung zwischen diesen beiden her.

Native Methodenbibliotheken

Sammlung nativer Bibliotheken, wie von der Execution Engine gefordert.

Ausführungs-Engine

Nun haben wir Java-Programm in Bytecode, das über einen Klassenlader den oben erläuterten Datenbereichen zugewiesen wird, und nun wird der Bytecode von der Ausführungs-Engine ausgeführt. Die Execution Engine liest einfach den Bytecode in Einheiten, wie eine Maschine, die Codezeilen nacheinander liest. Der Bytecode ist ein für Menschen lesbares Format, weshalb die Maschine nicht lesen kann, dass es ist, und in ein maschinenlesbares Format konvertiert werden muss, bei dem die folgenden Komponenten für den Interpretationszweck verwendet werden.

Die Execution Engine besteht aus drei Hauptkomponenten: Interpreter, JIT-Compiler und Garbage Collector.

1. Dolmetscher

Führt den Bytecode einfach in einer sequentiellen Methode aus. Ein Aufruf erfolgt durch eine Befehlszeilenabfrage mit einer kompilierten Datei als Argument. Der Interpreter interpretiert und führt Befehle ziemlich schnell nacheinander aus. Dies ist schneller als der JIT-Compiler, der den Code kompiliert.

Java-Klassenname

Eine main () - Klasse muss in einer kompilierten .class-Datei enthalten sein.

2. JIT-Compiler

Eine der wichtigsten Komponenten der Java-Laufzeitumgebung, die die Leistung der Java-Anwendung zur Laufzeit verbessert. Keine andere Komponente wirkt sich stärker auf die Leistung aus als der JIT-Compiler. Dies ist ein Standard-Compiler und wird aktiviert, wenn eine Java-Methode aufgerufen wird.

3. Garbage Collector

Wie der Name schon sagt, hat dies etwas mit Garbage zu tun. Garbage Collector sucht einfach nach jedem möglichen Objekt, das im JVM-Heap-Bereich verfügbar ist, prüft, ob es verwendet wird, und löscht die nicht verwendeten Objekte. Es markiert also einfach die Teile des Speichers, die gerade verwendet werden oder nicht. Dann wird weiter gewischt und das markierte Objekt einfach entfernt. Der beste Anwendungsfall ist, dass kein manuelles Speicherzuweisungssystem erforderlich ist, da der Garbage Collector nicht genutzten Speicherplatz automatisch entfernt. Da es sich jedoch um eine automatische Aufgabe handelt, hat kein Programmierer die Kontrolle über die Planung eines Zeitfensters für eine bestimmte Reinigungsaufgabe und benötigt mehr CPU-Leistung, wenn nach Objektreferenzen gesucht wird.

Fazit

Es ist zwar nicht zwingend erforderlich, ein klares Verständnis der Funktionsweise von JVM zu haben, für das Schreiben von Java-Code ist dies jedoch äußerst hilfreich. Für einen Entwickler, der die Arbeitsweise von JVM versteht, wird er besseren und optimierten Code schreiben, egal wie lang oder komplex die Anforderung ist. Neben der hier gegebenen Beschreibung bietet JVM eine breite Palette von Funktionen und Technologien. Diese Funktionen können verwendet werden, um die Leistung nach Bedarf eines bestimmten Herstellers zu verbessern

Empfohlene Artikel

Dies ist eine Anleitung zur Java Virtual Machine. Hier diskutieren wir die Architektur der Java Virtual Machine mit ihren verschiedenen Komponenten. Sie können sich auch die folgenden Artikel ansehen, um mehr zu erfahren -

  1. Blasensortierung in JavaScript
  2. Thread-Lebenszyklus in Java
  3. Was ist Java SE?
  4. Beste Java-Compiler
  5. JRE vs JVM | Top 8 Unterschiede zu (Infografiken)