Unterschied zwischen JVM, JRE und JDK

Unterschied zwischen JVM, JRE und JDK

1. Überblick

In diesem Artikel werden die Unterschiede zwischen JVM, JRE und JDK anhand ihrer Komponenten und Verwendungen erläutert.

2. JVM

Java Virtual Machine (JVM) ist eine Implementierung einer virtuellen Maschine, die ein Java-Programm ausführt.

Die JVM interpretiert zuerst den Bytecode. Anschließend werden die Klasseninformationen im Speicherbereich gespeichert. Schließlich wird der vom Java-Compiler generierte Bytecode ausgeführt.

Es ist eine abstrakte Rechenmaschine mit eigenem Befehlssatz und manipuliert zur Laufzeit verschiedene Speicherbereiche.

Komponenten der JVM sind:

  • Klassenlader

  • Laufzeitdatenbereiche

  • Ausführungs-Engine

2.1. Klassenlader

Zu den ersten Aufgaben der JVM gehört das Laden, Überprüfen und Verknüpfen des Bytecodes. Klassenladeprogramme erledigen diese Aufgaben.

Wir haben einen ausführlichen Artikel speziell zuclass loaders.

2.2. Laufzeitdatenbereiche

The JVM defines various memory areas to execute a Java program. Diese werden zur Laufzeit verwendet und als Laufzeitdatenbereiche bezeichnet. Einige dieser Bereiche werden beim Start der JVM erstellt und beim Beenden der JVM zerstört, während andere beim Erstellen eines Threads erstellt und beim Beenden eines Threads zerstört werden.

Betrachten wir diese Bereiche nacheinander:

Methodenbereich

Grundsätzlich entspricht der Methodenbereich dem Speicherbereich für kompilierten Code. Es speichert Strukturen wie Laufzeitkonstantenpool, Feld- und Methodendaten, den Code für Methoden und Konstruktoren sowie vollständig qualifizierte Klassennamen. Die JVM speichert diese Struktur für jede Klasse.

Der Methodenbereich, auch Permanent Generation Space (PermGen) genannt, wird beim Start der JVM erstellt. Der Speicher für diesen Bereich muss nicht zusammenhängend sein. Alle JVM-Threads nutzen diesen Speicherbereich gemeinsam.

Heap-Bereich

Die JVM weist den Speicher für alle Klasseninstanzen und Arrays aus diesem Bereich zu.

Garbage Collector (GC) beansprucht den Heapspeicher für Objekte zurück. Grundsätzlich besteht die GC aus drei Phasen, in denen Speicher aus Objekten zurückgewonnen werden kann. zwei kleinere GC und eine größere GC.

Der Heapspeicher besteht aus drei Teilen:

  • Eden Space - es ist ein Teil des Young Generation Space. Wenn wir ein Objekt erstellen, reserviert die JVM Speicher aus diesem Bereich

  • Survivor Space - es ist auch ein Teil des Young Generation Space. Der Überlebensraum enthält vorhandene Objekte, die die kleinen GC-Phasen des GC überstanden haben

  • Tenured Space - Dies ist auch als Old Generation Space bekannt. Es enthält lange überlebende Objekte. Grundsätzlich wird ein Schwellenwert für Young Generation-Objekte festgelegt, und wenn dieser Schwellenwert erreicht wird, werden diese Objekte in einen festen Raum verschoben.

JVM erstellt beim Start einen Heap-Bereich. Alle Threads der JVM teilen diesen Bereich. Der Speicher für den Heap-Bereich muss nicht zusammenhängend sein.

Stapelbereich

Speichert Daten als Frames und in jedem Frame werden lokale Variablen, Teilergebnisse und verschachtelte Methodenaufrufe gespeichert. JVM erstellt den Stapelbereich immer dann, wenn ein neuer Thread erstellt wird. Dieser Bereich ist für jeden Thread privat.

Jeder Eintrag im Stapel wird als Stapelrahmen oder Aktivierungsdatensatz bezeichnet. Jeder Rahmen besteht aus drei Teilen:

  • Local Variable Array - enthält alle lokalen Variablen und Parameter der Methode

  • Operandenstapel - wird als Arbeitsbereich zum Speichern des Ergebnisses der Zwischenberechnung verwendet

  • Rahmendaten - werden zum Speichern von Teilergebnissen, zum Zurückgeben von Werten für Methoden und zum Verweisen auf die TabelleExceptionverwendet, die im Falle von Ausnahmen entsprechende Fangblockinformationen enthält

Der Speicher für den JVM-Stapel muss nicht zusammenhängend sein.

PC-Register

Jeder JVM-Thread verfügt über ein separates PC-Register, in dem die Adresse des aktuell ausgeführten Befehls gespeichert ist. Wenn der aktuell ausgeführte Befehl Teil der nativen Methode ist, ist dieser Wert undefiniert.

Native Method Stacks

Native Methoden sind solche, die in anderen Sprachen als Java geschrieben sind.

JVM bietet Funktionen zum Aufrufen dieser nativen Methoden. Native Methodenstapel werden auch als "C-Stapel" bezeichnet. Sie speichern die systemeigenen Methodeninformationen. Wenn die systemeigenen Methoden zu Maschinencodes kompiliert werden, verwenden sie normalerweise einen systemeigenen Methodenstapel, um ihren Status zu verfolgen.

Die JVM erstellt diese Stapel, wenn sie einen neuen Thread erstellt. Daher teilen sich JVM-Threads diesen Bereich nicht.

2.3. Ausführungs-Engine

Die Ausführungsmaschine führt die Anweisungen unter Verwendung der in den Speicherbereichen vorhandenen Informationen aus. Es besteht aus drei Teilen:

Dolmetscher

Sobald Klassenladeprogramme Bytecode laden und verifizieren, führt der Interpreter den Bytecode Zeile für Zeile aus. Diese Ausführung ist ziemlich langsam. Der Nachteil des Interpreters besteht darin, dass jedes Mal, wenn eine Methode mehrmals aufgerufen wird, eine neue Interpretation erforderlich ist.

Die JVM verwendet jedoch den JIT-Compiler, um diesen Nachteil abzumildern.

Just-In-Time-Compiler (JIT)

Der JIT-Compiler kompiliert den Bytecode der häufig verwendeten Methoden zur Laufzeit in systemeigenen Code. Daher ist es für die Optimierung der Java-Programme verantwortlich.

JVM überwacht automatisch, welche Methoden ausgeführt werden. Sobald eine Methode für die JIT-Kompilierung in Frage kommt, ist die Kompilierung in Maschinencode geplant. Diese Methode wird dann als Hot-Methode bezeichnet. Diese Kompilierung in Maschinencode erfolgt in einem separaten JVM-Thread.

Dadurch wird die Ausführung des aktuellen Programms nicht unterbrochen. Nach dem Kompilieren in Maschinencode läuft es schneller.

Müllsammler

Java kümmert sich um die Speicherverwaltung mit Garbage Collection. Es geht darum, den Heapspeicher zu untersuchen, zu identifizieren, welche Objekte verwendet werden und welche nicht, und schließlich nicht verwendete Objekte zu löschen.

GC ist ein Daemon-Thread. Es kann explizit mit der MethodeSystem.gc _ () _ aufgerufen werden. Es wird jedoch nicht sofort ausgeführt und die JVM entscheidet, wann GC aufgerufen wird.

2.4. Java Native Interface

Es fungiert als Schnittstelle zwischen dem Java-Code und den nativen Bibliotheken (C / C ++).

Es gibt Situationen, in denen Java allein die Anforderungen für Ihre Anwendung nicht erfüllt, z. B. die Implementierung einer plattformabhängigen Funktion.

In diesen Fällen können wir JNI verwenden, um den Aufruf des in der JVM ausgeführten Codes zu ermöglichen. Umgekehrt können native Methoden den in der JVM ausgeführten Code aufrufen.

2.5. Native Libraries

Hierbei handelt es sich um plattformspezifische Bibliotheken, in denen native Methoden implementiert sind.

3. JRE

Java Runtime Environment (JRE) ist ein Bündel von Softwarekomponenten, mit denen Java-Anwendungen ausgeführt werden.

Kernkomponenten der JRE sind:

  • Eine Implementierung einer Java Virtual Machine (JVM)

  • Klassen, die zum Ausführen der Java-Programme erforderlich sind

  • Eigenschaftendateien

Wir haben die JVM im obigen Abschnitt besprochen. Hier konzentrieren wir uns auf die Kernklassen und Unterstützungsdateien.

3.1. Bootstrap-Klassen

Bootstrap-Klassen finden Sie unterjre/lib/. This path is also known as the bootstrap classpath. Es enthält:

  • Laufzeitklassen inrt.jar

  • Internationalisierungsklassen ini18n.jar

  • Zeichenkonvertierungsklassen incharsets.jar

  • Andere

Bootstrap ClassLoader lädt diese Klassen, wenn die JVM gestartet wird.

3.2. Erweiterungsklassen

Wir können Erweiterungsklassen injre/lib/extn/ finden, die als Verzeichnis für Erweiterungen der Java-Plattform dienen. This path is also known as extension classpath.

Es enthält JavaFX-Laufzeitbibliotheken injfxrt.jar und Gebietsschemadaten fürjava.text- undjava.util-Pakete inlocaledata.jar. Benutzer können diesem Verzeichnis auch benutzerdefinierte Gläser hinzufügen.

3.3. Eigenschafteneinstellungen

Die Java-Plattform verwendet diese Eigenschaftseinstellungen, um ihre Konfiguration beizubehalten. Abhängig von ihrer Verwendung befinden sie sich in verschiedenen Ordnern innerhalb von/jre/lib/. Diese schließen ein:

  • Kalenderkonfigurationen incalendar.properties

  • Protokollierungskonfigurationen inlogging.properties

  • Netzwerkkonfigurationen innet.properties

  • Bereitstellungseigenschaften in/jre/lib/deploy/

  • Verwaltungseigenschaften in/jre/lib/management/

3.4. Andere Dateien

Neben den oben genannten Dateien und Klassen enthält JRE auch Dateien für andere Angelegenheiten:

  • Sicherheitsmanagement beijre/lib/security

  • Das Verzeichnis zum Platzieren von Supportklassen für Applets beijre/lib/applet

  • Schriftartbezogene Dateien beijre/lib/fonts und anderen

4. JDK

Das Java Development Kit (JDK) bietet eine Umgebung und Tools zum Entwickeln, Kompilieren, Debuggen und Ausführen eines Java-Programms.

Kernkomponenten von JDK sind:

  • JRE

  • Entwicklungswerkzeuge

Wir haben die JRE im obigen Abschnitt besprochen.

Jetzt konzentrieren wir uns auf verschiedene Entwicklungswerkzeuge. Kategorisieren wir diese Tools anhand ihrer Verwendung:

4.1. Basiswerkzeug

Diese Tools bilden die Grundlage des JDK und werden zum Erstellen und Erstellen von Java-Anwendungen verwendet. Among these tools, we can find utilities for compiling, debugging, archiving, generating Javadocs, etc.

Sie beinhalten:

  • javac – liest Klassen- und Schnittstellendefinitionen und kompiliert sie in Klassendateien

  • java – startet die Java-Anwendung

  • javadoc – generiert HTML-Seiten der API-Dokumentation aus Java-Quelldateien

  • apt – findet und führt Anmerkungsprozessoren basierend auf den Anmerkungen aus, die in den angegebenen Quelldateien enthalten sind

  • appletviewer - ermöglicht es uns, Java-Applets ohne Webbrowser auszuführen

  • jar – packt Java-Applets oder -Anwendungen in ein einziges Archiv

  • jdb –ist ein Befehlszeilen-Debugging-Tool, mit dem Fehler in Java-Anwendungen gefunden und behoben werden können

  • javah – erzeugt C-Header- und Quelldateien aus einer Java-Klasse

  • javap – zerlegt die Klassendateien und zeigt Informationen zu Feldern, Konstruktoren und Methoden an, die in einer Klassendatei vorhanden sind

  • extcheck – erkennt Versionskonflikte zwischen der JAR-Zieldatei (JAR) und den aktuell installierten JAR-Erweiterungsdateien

4.2. Sicherheitstools

Dazu gehören Schlüssel- und Zertifikatverwaltungstools, mit denen Java-Keystores bearbeitet werden.

Ein Java-Keystore ist ein Container für Autorisierungszertifikate oder Public-Key-Zertifikate. Folglich wird es häufig von Java-basierten Anwendungen zur Verschlüsselung, Authentifizierung und Bereitstellung über HTTPS verwendet.

Außerdem helfen sie beim Festlegen der Sicherheitsrichtlinien auf unserem System und beim Erstellen von Anwendungen, die im Rahmen dieser Richtlinien in der Produktionsumgebung funktionieren können. Diese schließen ein:

  • keytool – hilft bei der Verwaltung von Keystore-Einträgen, nämlich kryptografischen Schlüsseln und Zertifikaten

  • jarsigner – generiert mithilfe von Keystore-Informationen digital signierte JAR-Dateien

  • Mitpolicytool –  können wir die Konfigurationsdateien für externe Richtlinien verwalten, die die Sicherheitsrichtlinie der Installation definieren

Einige Sicherheitstools helfen auch bei der Verwaltung von Kerberos-Tickets.

Kerberos ist ein Netzwerkauthentifizierungsprotokoll.

Es funktioniert auf der Basis von Tickets, damit Knoten, die über ein nicht sicheres Netzwerk kommunizieren, ihre Identität auf sichere Weise beweisen können:

  • kinit – zum Abrufen und Zwischenspeichern von Kerberos-Tickets, die Tickets gewähren

  • ktab – verwaltet Prinzipalnamen und Schlüsselpaare in der Schlüsseltabelle

  • klist – zeigt Einträge im Cache für lokale Anmeldeinformationen und in der Schlüsseltabelle an

4.3. Internationalisierungs-Tool

Bei der Internationalisierung wird eine Anwendung so entworfen, dass sie ohne technische Änderungen an verschiedene Sprachen und Regionen angepasst werden kann.

Zu diesem Zweck bringt das JDKnative2ascii. . Dieses Tool konvertiert eine Datei mit von JRE unterstützten Zeichen in Dateien, die in ASCII- oder Unicode-Escapezeichen codiert sind.

4.4. RMI-Tools (Remote Method Invocation)

RMI-Tools ermöglichen die Remote-Kommunikation zwischen Java-Anwendungen und bieten somit Raum für die Entwicklung verteilter Anwendungen.

Mit RMI kann ein Objekt, das in einer JVM ausgeführt wird, Methoden für ein Objekt aufrufen, das in einer anderen JVM ausgeführt wird. Diese Tools umfassen:

  • rmic – generiert Stub-, Skeleton- und Tie-Klassen für Remote-Objekte mithilfe des Java Remote Method Protocol (JRMP) oder des Internet Inter-Orb Protocol (IIOP).

  • rmiregistry – erstellt und startet die Remote-Objektregistrierung

  • rmid – startet den Aktivierungssystem-Daemon. Dadurch können Objekte in einer Java Virtual Machine registriert und aktiviert werden

  • serialver – gibt die UID der seriellen Version für bestimmte Klassen zurück

4.5. Java IDL- und RMI-IIOP-Tools

Die Java Interface Definition Language (IDL) erweitert die Java-Plattform um die CORBA-Funktion (Common Object-Based Request Broker Architecture).

Mit diesen Tools können verteilte Java-Webanwendungen Vorgänge auf Remotenetzwerkdiensten mithilfe von IDL (Object Management Group) nach Industriestandard aufrufen.

Ebenso könnten wir das Internet InterORB Protocol (IIOP) verwenden.

RMI-IIOP, d.h. RMI over IIOP ermöglicht die Programmierung von CORBA-Servern und -Anwendungen über die RMI-API. Dies ermöglicht die Verbindung zwischen zwei Anwendungen, die in einer beliebigen CORBA-kompatiblen Sprache über das Internet InterORB Protocol (IIOP) geschrieben sind.

Diese Tools umfassen:

  • tnameserv – vorübergehender Namensdienst, der ein baumstrukturiertes Verzeichnis für Objektreferenzen bereitstellt

  • idlj –ist der IDL-zu-Java-Compiler zum Generieren der Java-Bindungen für eine angegebene IDL-Datei

  • orbd – enable Clients zum transparenten Suchen und Aufrufen persistenter Objekte auf dem Server in der CORBA-Umgebung

  • servertool – bietet eine Befehlszeilenschnittstelle zum Registrieren oder Aufheben der Registrierung eines persistenten Servers bei ORB Daemon (orbd) sowie zum Starten und Herunterfahren eines bei ORB Daemon usw. registrierten persistenten Servers

4.6. Java-Bereitstellungstools

These tools help in deploying Java applications and applets on the web. Dazu gehören:

  • pack200 – wandelt eine JAR-Datei mit dem Javagzip-Kompressor in einepack200-Datei um

  • unpack200 – wandelt die Datei vonpack200in eine JAR-Datei um

4.7. Java-Plug-in-Tool

JDK stellt unshtmlconverter. zur Verfügung. Außerdem wird es in Verbindung mit dem Java-Plug-In verwendet.

Einerseits stellt das Java-Plug-in eine Verbindung zwischen gängigen Browsern und der Java-Plattform her. Aufgrund dieser Verbindung können Applets auf der Website in einem Browser ausgeführt werden.

Andererseits isthtmlconverter ein Dienstprogramm zum Konvertieren einer HTML-Seite mit Applets in ein Format für das Java-Plug-in.

4.8. Java Web Start Tool

JDK bringtjavaws. Wir können es in Verbindung mit dem Java Web Start verwenden.

This tool allows us to download and launch Java applications with a single click from the browser. Daher muss kein Installationsprozess ausgeführt werden.

4.9. Überwachungs- und Verwaltungstools

These are great tools that we can use to monitor JVM performance and resource consumption. Hier einige davon ::

  • jconsole – bietet eine grafische Konsole, mit der Sie Java-Anwendungen überwachen und verwalten können

  • jps – listet die instrumentierten JVMs auf dem Zielsystem auf

  • jstat – überwacht JVM-Statistiken

  • jstatd – überwacht die Erstellung und Beendigung instrumentierter JVMs

4.10. Tools zur Fehlerbehebung

These are experimental tools that we can leverage for troubleshooting tasks:

  • info – generiert Konfigurationsinformationen für einen bestimmten Java-Prozess

  • jmap – druckt Speicherzuordnungen für gemeinsam genutzte Objekte oder Heapspeicherdetails eines bestimmten Prozesses

  • jsadebugd – stellt eine Verbindung zu einem Java-Prozess her und fungiert als Debug-Server

  • jstack – druckt Java-Stack-Traces von Java-Threads für einen bestimmten Java-Prozess

5. Fazit

In diesem Artikel haben wir festgestellt, dass der grundlegende Unterschied zwischen JVM, JRE und JDK in ihrer Verwendung liegt.

Zuerst haben wir beschrieben, wie die JVM eine abstrakte Rechenmaschine ist, die tatsächlich den Java-Bytecode ausführt.

Anschließend wurde erklärt, wie Java-Anwendungen ausgeführt werden. Wir verwenden die JRE.

Und schließlich haben wir verstanden, wie man Java-Anwendungen entwickelt, wir verwenden das JDK.

Wir haben auch einige Zeit gebraucht, um uns mit Werkzeugen und grundlegenden Konzepten dieser Komponenten zu befassen.