Skip to content

JDK vs. JRE vs. JVM ​

🟒 EinstiegBearbeitet

Notizen ​

JDK (Java Development Kit) liefert Tools und Libraries um Java Applikationen zu entwickeln. JDK Funktioniert mit JRE und JVM. JRE (Java Runtime Environment) liefert Libraries und JVM wir benΓΆtigt um Java Applikationen laufen zu lassen. JVM (Java Virtual Machine) fΓΌhrt den kompilierten Java Bytecode auf dem System aus. Wichtig zu verstehen ist: Java ist mit unter eine sehr populΓ€re Sprache da Sie eine PlattformunabhΓ€ngige Sprache ist. Der Grund dafΓΌr ist das JVM. Java Bytecode kann auf jeder beliebigen JVM laufen, aber eine JVM ist plattformabhΓ€ngig zu installieren.

JDK (Java Development Kit) ​

JDK ist ein Software-Entwicklungskit, das zum Erstellen von Java-Anwendungen verwendet wird. Es enthΓ€lt die JRE und eine Reihe von Entwicklungstools.

  • EnthΓ€lt einen Compiler (javac), einen Debugger und Dienstprogramme wie jar und javadoc.
  • Stellt die JRE bereit, sodass auch Java-Programme ausgefΓΌhrt werden kΓΆnnen.
  • Wird von Entwicklern zum Schreiben, Kompilieren und Debuggen von Code benΓΆtigt.

Komponenten des JDK: ​

  • JRE (JVM + Bibliotheken)
  • Entwicklungswerkzeuge (Compiler, jar, javadoc, Debugger)

Hinweis: ​

  • Das JDK dient nur zur Entwicklung (es wird nicht zum AusfΓΌhren von Java-Programmen benΓΆtigt).
  • Das JDK ist plattformabhΓ€ngig (unterschiedliche Versionen fΓΌr Windows, Linux, macOS).

JRE (Java Runtime Environment) ​

JRE bietet eine Umgebung um Java programme laufen zu lassen, aber besitzt keine entwickler Tools. Der Sinn von Java Runtime Environments ist fΓΌr End-User die Anwendungen ausfΓΌhren mΓΌssen.

  • Innerhalb der JRE ist die JVM zu finden und Standard Klassen Libraries
  • Liefert Alle Bestandteile um eine Java Applikation zu laufen
  • Ist kein Kompiler oder Debugger

Note: ​

  • JRE dient nur zum AusfΓΌhren von Anwendungen, nicht zu deren Entwicklung.
  • Es ist plattformabhΓ€ngig (unterschiedliche Builds fΓΌr unterschiedliche Betriebssysteme).

JVM (Java Virtual Machine) ​

JVM ist das zentrale AusfΓΌhrungssystem von Java. Es ist verantworting fΓΌr die Konvertierung von Bytecode in maschinell lesbaren Code.

  • Teil von JDK und JRE
  • Benutzt Memory Management und Garbage Kollektion
  • Bietet PlattformunabhΓ€gigkeit, da es den selben Bytecode auf verschiedenen Systemen ausfΓΌhrt

Note: ​

  • JVM implementierungen sind PlattformabhΓ€ngig
  • Bytecode ist jedoch plattform UnabhΓ€ngig und wird auf jeder JVM ausgefΓΌhrt.
  • Moderne (neue) JVMs sind abhΓ€ngig von Just-In-Time (JIT) kompilierung fΓΌr Performance
AspectJDKJREJVM
PurposeUsed to develop Java applicationsUsed to run Java applicationsExecutes Java bytecode
Platform DependencyPlatform-dependent (OS specific)Platform-dependent (OS specific)JVM is OS-specific, but bytecode is platform-independent
IncludesJRE + Development tools (javac, debugger, etc.)JVM + Libraries (e.g., rt.jar)ClassLoader, JIT Compiler, Garbage Collector
Use CaseWriting and compiling Java codeRunning a Java application on a systemConvert bytecode into native machine code

Interview-Fragen ​

Was ist der Unterschied zwischen JDK, JRE und JVM? ​

Antwort: Das JDK ist das komplette Entwicklungspaket – es enthΓ€lt die JRE plus Entwicklungstools wie den Compiler javac, Debugger und Utilities wie jar und javadoc. Die JRE ist die Laufzeitumgebung, die man braucht um Java-Programme auszufΓΌhren – sie enthΓ€lt die JVM und die Standard-Bibliotheken. Die JVM selbst ist die virtuelle Maschine, die den kompilierten Bytecode in nativen Maschinencode ΓΌbersetzt und ausfΓΌhrt. Kurz gesagt: JDK βŠƒ JRE βŠƒ JVM.


Warum gilt Java als plattformunabhΓ€ngig, obwohl die JVM plattformabhΓ€ngig ist? ​

Antwort: Java-Quellcode wird zu Bytecode kompiliert, und dieser Bytecode ist plattformunabhΓ€ngig – er sieht auf jedem System gleich aus. Die JVM hingegen ist plattformspezifisch, es gibt also unterschiedliche JVM-Implementierungen fΓΌr Windows, Linux, macOS etc. Das Prinzip ist β€žWrite Once, Run Anywhere": Man schreibt den Code einmal, kompiliert ihn zu Bytecode, und dieser lΓ€uft dann auf jeder JVM, egal auf welchem Betriebssystem sie installiert ist.


Braucht ein Endanwender das JDK um eine Java-Applikation auszufΓΌhren? ​

Antwort: Nein. Ein Endanwender braucht nur die JRE (bzw. ab Java 11+ ein JDK, da Oracle die separate JRE-Distribution eingestellt hat). Das JDK enthÀlt zusÀtzlich Entwicklertools wie den Compiler, die ein reiner Anwender nicht benâtigt. In der Praxis wird heute aber oft einfach das JDK installiert, weil es die JRE mit einschließt.


Was passiert unter der Haube, wenn man java MyApp ausfΓΌhrt? ​

Antwort: Die JVM startet und der ClassLoader lÀdt die Klasse MyApp.class (den Bytecode). Dann verifiziert der Bytecode-Verifier, dass der Code valide und sicher ist. Anschließend interpretiert die JVM den Bytecode oder kompiliert ihn über den JIT-Compiler (Just-In-Time) in nativen Maschinencode für bessere Performance. WÀhrend der Ausführung kümmert sich die JVM außerdem um Memory Management und Garbage Collection.


Was ist der JIT-Compiler und warum ist er wichtig? ​

Antwort: Der JIT-Compiler (Just-In-Time) ist ein Bestandteil der JVM, der zur Laufzeit hΓ€ufig ausgefΓΌhrten Bytecode (β€žHot Spots") in nativen Maschinencode ΓΌbersetzt. Ohne JIT wΓΌrde die JVM den Bytecode nur interpretieren, was langsamer wΓ€re. Durch JIT-Kompilierung erreicht Java eine Performance, die nahe an nativ kompilierten Sprachen wie C++ liegt. Moderne JVMs wie HotSpot nutzen das aggressiv – Code der selten lΓ€uft wird interpretiert, Code der oft lΓ€uft wird kompiliert und optimiert.


Was ist der Unterschied zwischen Bytecode und Maschinencode? ​

Antwort: Bytecode ist ein Zwischenformat, das der Java-Compiler (javac) aus dem Quellcode erzeugt. Er ist plattformunabhΓ€ngig und wird in .class-Dateien gespeichert. Maschinencode hingegen ist der native Code, den die CPU direkt ausfΓΌhren kann – er ist plattformspezifisch. Die JVM ΓΌbernimmt die Übersetzung von Bytecode zu Maschinencode, entweder durch Interpretation oder JIT-Kompilierung.


KΓΆnnen andere Sprachen auf der JVM laufen? ​

Antwort: Ja, die JVM ist nicht auf Java beschrΓ€nkt. Jede Sprache, die zu JVM-kompatiblem Bytecode kompiliert werden kann, lΓ€uft auf der JVM. Bekannte Beispiele sind Kotlin, Scala, Groovy und Clojure. Das ist einer der großen Vorteile der JVM-Architektur – das gesamte Java-Γ–kosystem (Libraries, Tools, Performance-Optimierungen) steht auch diesen Sprachen zur VerfΓΌgung.


Was macht der Garbage Collector in der JVM? ​

Antwort: Der Garbage Collector (GC) ist fΓΌr automatisches Memory Management zustΓ€ndig. Er identifiziert Objekte im Heap, die nicht mehr referenziert werden, und gibt deren Speicher wieder frei. Das bedeutet, Entwickler mΓΌssen sich nicht manuell um malloc/free kΓΌmmern wie in C. Es gibt verschiedene GC-Implementierungen in der JVM (z.B. G1, ZGC, Shenandoah), die jeweils unterschiedliche Trade-offs zwischen Durchsatz und Latenz bieten.