Unterschied zwischen JVM, JRE und JDK

1. Übersicht

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 einem eigenen Befehlssatz, die zur Laufzeit verschiedene Speicherbereiche bearbeitet.

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. Klassenlader erledigen diese Aufgaben.

Wir haben einen ausführlichen Artikel speziell über Klassenlader.

2.2. Laufzeitdatenbereiche

Die JVM definiert verschiedene Speicherbereiche, um ein Java-Programm auszuführen. 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 einzeln:

Methodenbereich

Grundsätzlich ist der Methodenbereich analog zum 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 als permanenter Generierungsraum (PermGen) bezeichnet, wird beim Start der JVM erstellt. Der Speicher für diesen Bereich muss nicht zusammenhängend sein. Alle JVM-Threads teilen sich diesen Speicherbereich.

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 hat GC drei Phasen, um Speicher von Objekten zurückzugewinnen, nämlich. zwei kleine GC und eine große GC.

Der Heapspeicher besteht aus drei Teilen:

  • Eden Space - es ist ein Teil des Young Generation Space. Wenn wir ein Objekt erstellen, weist die JVM Speicher aus diesem Bereich zu
  • Survivor Space - es ist auch ein Teil des Young Generation Space. Der Überlebensraum enthält vorhandene Objekte, die die kleinen GC-Phasen der GC überlebt haben
  • Tenured Space - Dies wird auch als Old Generation Space bezeichnet. Es enthält lange überlebende Objekte. Grundsätzlich wird ein Schwellenwert für Objekte der jungen Generation festgelegt. Wenn dieser Schwellenwert erreicht wird, werden diese Objekte in den festen Raum verschoben.

JVM erstellt einen Heap-Bereich, sobald er gestartet wird. Alle Threads der JVM teilen sich diesen Bereich. Der Speicher für den Heap-Bereich muss nicht zusammenhängend sein.

Stapelbereich

Speichert Daten als Frames und jeder Frame speichert lokale Variablen, Teilergebnisse und verschachtelte Methodenaufrufe. 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:

  • Lokales Variablenarray - 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 Ausnahmetabelle verwendet , die im Falle von Ausnahmen entsprechende Catch-Block-Informationen enthält

Der Speicher für den JVM-Stack 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 die aktuell ausgeführte Anweisung 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 Method Stacks werden auch als "C Stacks" bezeichnet. Sie speichern die nativen Methodeninformationen. Wenn die nativen Methoden zu Maschinencodes kompiliert werden, verwenden sie normalerweise einen nativen Methodenstapel, um ihren Status zu verfolgen.

Die JVM erstellt diese Stapel immer dann, wenn ein neuer Thread erstellt wird. Daher teilen sich JVM-Threads diesen Bereich nicht.

2.3. Ausführungs-Engine

Die Ausführungs-Engine führt die Anweisungen unter Verwendung von Informationen aus, die in den Speicherbereichen vorhanden sind. Es besteht aus drei Teilen:

Dolmetscher

Sobald Klassenlader den Bytecode geladen und überprüft haben, führt der Interpreter den Bytecode zeilenweise aus. Diese Ausführung ist ziemlich langsam. Der Nachteil des Interpreters besteht darin, dass bei mehrmaligem Aufruf einer Methode jedes Mal 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 aufgerufenen Methoden zur Laufzeit in nativen 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 mithilfe der Garbage Collection. Es geht darum, den Heap-Speicher 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 System aufgerufen werden . Die Methode gc () 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 (C / C ++) Bibliotheken.

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

Dies sind plattformspezifische Bibliotheken, die die Implementierung nativer Methoden enthalten.

3. JRE

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

Zu den Kernkomponenten der JRE gehören:

  • 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

Wir finden Bootstrap-Klassen unter jre / lib / . Dieser Pfad wird auch als Bootstrap-Klassenpfad bezeichnet. Es enthält:

  • Laufzeitklassen in rt.jar
  • Internationalisierungskurse in i18n.jar
  • Zeichenkonvertierungsklassen in charsets.jar
  • Andere

Bootstrap ClassLoader lädt diese Klassen beim Start der JVM.

3.2. Erweiterungsklassen

Wir finden Erweiterungsklassen in jre / lib / extn /, das als Verzeichnis für Erweiterungen der Java-Plattform fungiert. Dieser Pfad wird auch als Erweiterungsklassenpfad bezeichnet.

Es enthält JavaFX-Laufzeitbibliotheken in jfxrt.jar und Gebietsschemadaten für die Pakete java.text und java.util in localedata.jar . Benutzer können diesem Verzeichnis auch benutzerdefinierte Gläser hinzufügen.

3.3. Eigenschafteneinstellungen

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

  • Kalenderkonfigurationen in der Datei calendar.properties
  • Protokollierungskonfigurationen in logging.properties
  • Netzwerkkonfigurationen in net.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 unter jre / lib / security
  • Das Verzeichnis zum Platzieren von Supportklassen für Applets unter jre / lib / applet
  • Schriftartbezogene Dateien unter jre / 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.

Zu den Kernkomponenten von JDK gehören:

  • JRE
  • Entwicklungswerkzeuge

Wir haben die JRE im obigen Abschnitt besprochen.

Jetzt konzentrieren wir uns auf verschiedene Entwicklungswerkzeuge. Lassen Sie uns diese Tools anhand ihrer Verwendung kategorisieren:

4.1. Basiswerkzeug

Diese Tools bilden die Grundlage des JDK und werden zum Erstellen und Erstellen von Java-Anwendungen verwendet. Unter diesen Tools finden wir Dienstprogramme zum Kompilieren, Debuggen, Archivieren, Generieren von Javadocs usw.

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 die Ausführung von Java-Applets ohne Webbrowser
  • jar - packt Java-Applets oder -Anwendungen in ein einziges Archiv
  • jdb - ein Befehlszeilen-Debugging-Tool zum Auffinden und Beheben von Fehlern in Java-Anwendungen
  • 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 (Target Java Archive) 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 dabei, die Sicherheitsrichtlinien auf unserem System festzulegen und Anwendungen zu erstellen, 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 digital signierte JAR-Dateien mithilfe von Keystore-Informationen
  • policytool - Ermöglicht die Verwaltung der externen Richtlinienkonfigurationsdateien, die die Sicherheitsrichtlinie der Installation definieren

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

Kerberos ist ein Netzwerkauthentifizierungsprotokoll.

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

  • kinit - wird verwendet, um Kerberos-Tickets zu erhalten und zwischenzuspeichern, die Tickets gewähren
  • ktab - verwaltet Prinzipnamen 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. Internationalisierungstool

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 JDK native2ascii. 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 Registrierung von Remoteobjekten
  • rmid - s startet den Daemon des Aktivierungssystems. 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 Remote-Netzwerkdiensten mithilfe der branchenüblichen Object Management Group (OMG) - IDL aufrufen.

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

RMI-IIOP, dh RMI über 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 wurden.

Diese Tools umfassen:

  • tnameserv - transienter Namensdienst, der ein baumstrukturiertes Verzeichnis für Objektreferenzen bereitstellt
  • idlj - der IDL-zu-Java-Compiler zum Generieren der Java-Bindungen für eine angegebene IDL-Datei
  • orbd - Ermöglicht Clients das transparente 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 ), Starten und Herunterfahren eines persistenten Servers, der bei ORB Daemon registriert ist, usw.

4.6. Java-Bereitstellungstools

Diese Tools helfen bei der Bereitstellung von Java-Anwendungen und -Applets im Web. Sie beinhalten:

  • pack200 - wandelt eine JAR- Datei mit dem Java- gzip- Kompressor in eine pack200- Datei um
  • unpack200 - wandelt die pack200- Datei in eine JAR-Datei um

4.7. Java Plug-in Tool

JDK stellt uns HTML-Konverter zur Verfügung. Darüber hinaus 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 ist htmlconverter 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 bringt Javaws. Wir können es in Verbindung mit dem Java Web Start verwenden.

Mit diesem Tool können wir Java-Anwendungen mit einem einzigen Klick aus dem Browser herunterladen und starten. Daher muss kein Installationsprozess ausgeführt werden.

4.9. Überwachungs- und Verwaltungstools

Dies sind großartige Tools, mit denen wir die JVM-Leistung und den Ressourcenverbrauch überwachen können. Hier sind 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

Dies sind experimentelle Tools, die wir zur Fehlerbehebung einsetzen können :

  • 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. Schlussfolgerung

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

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

Anschließend haben wir 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 uns auch einige Zeit genommen, um uns mit Werkzeugen und grundlegenden Konzepten dieser Komponenten zu befassen.