Was ist JVM?
Java Virtual Machine (JVM) ist eine Maschine, die eine Laufzeitumgebung zur Steuerung des Java-Codes oder der Anwendungen bietet. Sie wandelt Java-Bytecode in Maschinensprache um. Die JVM ist ein Teil der Java-Laufumgebung (JRE). In anderen Programmiersprachen erzeugt der Compiler Maschinencode für ein bestimmtes System. Der Java-Compiler erzeugt jedoch Code für eine virtuelle Maschine, die als Java Virtual Machine bekannt ist.
So funktioniert die JVM
Zunächst wird der Java-Code in Bytecode kompiliert. Dieser Bytecode wird auf verschiedenen Maschinen interpretiert.“
Zwischen dem Host-System und dem Java-Quellcode ist der Bytecode eine Zwischensprache.
Die JVM in Java ist für die Allokation von Speicherplatz zuständig.
In diesem JVM-Tutorial, lernen Sie-
- JVM-Architektur
- Prozess der Kompilierung von Softwarecode &Ausführung
- Prozess der Kompilierung und Ausführung von C-Code
- Prozess der Kompilierung und Ausführung von Java-Code
- Warum ist Java sowohl interpretierte als auch kompilierte Sprache?
- Warum ist Java langsam?
JVM-Architektur
Nun wollen wir in diesem JVM-Tutorial die Architektur der JVM verstehen. Die JVM-Architektur in Java enthält den Classloader, den Speicherbereich, die Execution Engine usw.
1) ClassLoader
Der ClassLoader ist ein Subsystem zum Laden von Klassendateien. Er führt drei Hauptfunktionen aus, nämlich das Laden, Verknüpfen und Initialisieren.
2) Method Area
Die Method Area der CVM speichert Klassenstrukturen wie Metadaten, den Konstanten-Laufzeitpool und den Code für Methoden.
3) Heap
Alle Objekte, ihre zugehörigen Instanzvariablen und Arrays werden im Heap gespeichert. Dieser Speicher ist gemeinsam und wird von mehreren Threads genutzt.
4) JVM-Sprachstapel
Java-Sprachstapel speichern lokale Variablen und ihre Teilergebnisse. Jeder Thread hat seinen eigenen JVM-Stack, der gleichzeitig mit dem Erzeugen des Threads angelegt wird. Ein neuer Stapel wird bei jedem Methodenaufruf erstellt und nach Abschluss des Methodenaufrufs gelöscht.
5) PC-Register
PC-Register speichern die Adresse der Anweisung der Java Virtual Machine, die gerade ausgeführt wird. In Java hat jeder Thread sein eigenes PC-Register.
6) Native Methodenstapel
Native Methodenstapel halten die Anweisungen des nativen Codes, der von der nativen Bibliothek abhängt. Sie ist nicht in Java, sondern in einer anderen Sprache geschrieben.
7) Execution Engine
Es handelt sich um eine Art von Software, die zum Testen von Hardware, Software oder kompletten Systemen verwendet wird. Die Testausführungsengine trägt niemals Informationen über das getestete Produkt.
8) Native Method Interface
Das Native Method Interface ist ein Programmierrahmen. Es ermöglicht Java-Code, der in einer JVM läuft, den Aufruf durch Bibliotheken und native Anwendungen.
9) Native Methodenbibliotheken
Native Bibliotheken sind eine Sammlung der nativen Bibliotheken (C, C++), die von der Execution Engine benötigt werden.
Software Code Compilation & Ausführungsprozess
Um ein Softwareprogramm zu schreiben und auszuführen, benötigen Sie folgendes
1) Editor – Um Ihr Programm einzutippen, ein Notizblock könnte dafür verwendet werden
2) Compiler – Um Ihr Hochsprachenprogramm in nativen Maschinencode umzuwandeln
3) Linker – Um verschiedene Programmdateien, die in Ihrem Hauptprogramm referenziert werden, miteinander zu kombinieren.
4) Loader – Zum Laden der Dateien von Ihrem sekundären Speichermedium wie Festplatte, Flash Drive, CD in den RAM zur Ausführung. Das Laden erfolgt automatisch, wenn Sie Ihren Code ausführen.
5) Execution – Die eigentliche Ausführung des Codes, die von Ihrem OS &-Prozessor übernommen wird.
Vor diesem Hintergrund lernen Sie im folgenden Video & die interne Arbeitsweise und Architektur der JVM (Java Virtual Machine) kennen.
Klicken Sie hier, wenn das Video nicht zugänglich ist
C-Code Kompilierungs- und Ausführungsprozess
Um den Kompilierungsprozess in Java zu verstehen. Werfen wir zunächst einen kurzen Blick auf den Kompilier- und Verknüpfungsprozess in C.
Angenommen, Sie haben in der main zwei Funktionen f1 und f2 aufgerufen. Die Hauptfunktion ist in der Datei a1.c gespeichert.
Die Funktion f1 ist in der Datei a2.c
Funktion f2 ist in einer Datei a3 gespeichert.c
Alle diese Dateien, d.h., a1.c, a2.c, und a3.c, werden dem Compiler zugeführt. Dessen Ausgabe sind die entsprechenden Objektdateien, die den Maschinencode darstellen.
Der nächste Schritt ist die Integration all dieser Objektdateien in eine einzige .exe-Datei mit Hilfe des Linkers. Der Linker fügt alle diese Dateien zusammen und erzeugt die .exe-Datei.
Während des Programmlaufs lädt ein Loader-Programm eine.exe in den Arbeitsspeicher zur Ausführung.
Java-Code-Kompilierung und -Ausführung in der Java VM
Nun wollen wir uns in diesem JVM-Tutorial den Prozess für JAVA ansehen. In Ihrem main haben Sie zwei Methoden f1 und f2.
- Die main-Methode ist in der Datei a1.java gespeichert
- f1 ist in einer Datei als a2.java gespeichert
- f2 ist in einer Datei als a3 gespeichert.java
Der Compiler kompiliert die drei Dateien und erzeugt 3 entsprechende .class-Dateien, die aus BYTE-Code bestehen. Im Gegensatz zu C wird kein Linking durchgeführt.
Die Java VM oder Java Virtual Machine befindet sich im RAM. Während der Ausführung werden die Klassendateien mit Hilfe des Klassenladers auf den RAM gebracht. Der BYTE-Code wird auf eventuelle Sicherheitslücken überprüft.
Nächstens wandelt die Ausführungsmaschine den Bytecode in nativen Maschinencode um. Dies ist eine Just-in-Time-Kompilierung. Es ist einer der Hauptgründe, warum Java vergleichsweise langsam ist.
Hinweis: JIT oder Just-in-time-Compiler ist der Teil der Java Virtual Machine (JVM). Er interpretiert einen Teil des Byte-Codes, der gleichzeitig eine ähnliche Funktionalität hat.
Warum ist Java sowohl interpretierte als auch kompilierte Sprache?
Programmiersprachen werden klassifiziert als
- Higher Level Language Ex. C++, Java
- Middle-Level-Sprachen Bsp. C
- Low-Level-Sprache Bsp. Assembly
- Schließlich die niedrigste Ebene wie die Maschinensprache.
Ein Compiler ist ein Programm, das ein Programm von einer Sprachebene in eine andere umwandelt. Beispiel: Umwandlung eines C++-Programms in Maschinencode.
Der Java-Compiler konvertiert High-Level-Java-Code in Bytecode (der auch eine Art von Maschinencode ist).
Ein Interpreter ist ein Programm, das ein Programm auf einer Ebene in eine andere Programmiersprache auf der gleichen Ebene umwandelt. Beispiel: Konvertierung eines Java-Programms in C++
In Java wandelt der Just-In-Time-Code-Generator den Bytecode in den nativen Maschinencode um, der sich auf der gleichen Programmierebene befindet.
Damit ist Java sowohl eine kompilierte als auch eine interpretierte Sprache.
Warum ist Java langsam?
Die beiden Hauptgründe für die Langsamkeit von Java sind
- Dynamisches Linken: Im Gegensatz zu C erfolgt das Linken zur Laufzeit, also jedes Mal, wenn das Programm in Java ausgeführt wird.
- Laufzeit-Interpreter: Die Umwandlung von Bytecode in nativen Maschinencode erfolgt in Java zur Laufzeit, was die Geschwindigkeit weiter verlangsamt
Die neueste Version von Java hat die Leistungsengpässe jedoch weitgehend behoben.
Zusammenfassung:
- Die vollständige Form von JVM ist Java Virtual Machine. Die JVM in Java ist der Motor, der den Java-Code antreibt. Sie wandelt Java-Bytecode in Maschinensprache um.
- Die JVM-Architektur in Java enthält einen Classloader, einen Speicherbereich, eine Ausführungs-Engine usw.
- In der JVM wird der Java-Code zu Bytecode kompiliert. Dieser Bytecode wird auf verschiedenen Maschinen interpretiert
- JIT steht für Just-in-time-Compiler. JIT ist der Teil der Java Virtual Machine (JVM). Es wird verwendet, um die Ausführungszeit zu beschleunigen
- Im Vergleich zu anderen Compiler-Maschinen kann die JVM in Java langsam in der Ausführung sein.