Java
Java ist eine objektorientierte Allzweck-Programmiersprache und Softwareplattform, die für die Entwicklung von Anwendungen konzipiert wurde, die auf unterschiedlichen Betriebssystemen und Hardwareplattformen ausgeführt werden können. Java wird für die Entwicklung von Server- und Unternehmenssystemen, Webanwendungen, Cloud-Services, Datenverarbeitungssoftware und anderen Arten von Software eingesetzt.
Eine der wichtigsten Eigenschaften von Java ist die Ausführung von Programmen über die Java Virtual Machine (JVM). Der Quellcode wird in der Regel nicht direkt in Maschinenbefehle für einen bestimmten Prozessor kompiliert, sondern in einen plattformunabhängigen Zwischencode – den sogenannten Bytecode –, der von der JVM ausgeführt wird. Dadurch kann dasselbe Java-Programm auf unterschiedlichen Plattformen ausgeführt werden, sofern eine kompatible virtuelle Maschine vorhanden ist.
Wie funktioniert Java?
Die Entwicklung und Ausführung eines klassischen Java-Programms umfasst mehrere grundlegende Schritte:
- Der Entwickler schreibt den Quellcode in .java-Dateien.
- Der Java-Compiler übersetzt ihn in Bytecode.
- Das Ergebnis wird in der Regel in .class-Dateien gespeichert.
- Die JVM lädt die erforderlichen Klassen.
- Die virtuelle Maschine überprüft den Bytecode und führt ihn aus.
- Die JVM kommuniziert mit dem Betriebssystem und der Hardware.
Beispielsweise lässt sich dieselbe kompilierte .class-Datei sowohl auf einem Entwickler-Notebook als auch auf einem Linux-Server im Rechenzentrum ausführen.
Vereinfacht sieht der Ablauf folgendermaßen aus:
Java-Quellcode → Compiler → Java-Bytecode → JVM → Betriebssystem → Hardware
Dadurch lässt sich die Anwendung weitgehend von den Besonderheiten eines bestimmten Betriebssystems und einer bestimmten Prozessorarchitektur entkoppeln.
Was ist die JVM?
Die JVM (Java Virtual Machine) ist eine virtuelle Maschine, die Java-Bytecode ausführt. Implementierungen der JVM stehen für unterschiedliche Betriebssysteme und Hardwareplattformen zur Verfügung.
Die JVM übernimmt mehrere wichtige Aufgaben:
- Laden von Klassen;
- Überprüfung des Bytecodes;
- Speicherverwaltung;
- Ausführung des Codes;
- automatische Garbage Collection;
- Bereitstellung der Laufzeitumgebung für Anwendungen.
Beispielsweise gibt die JVM nicht mehr benötigten Arbeitsspeicher selbstständig frei, sodass Entwickler ihn nicht manuell verwalten müssen.
Zur Verbesserung der Performance können moderne JVMs die JIT-Kompilierung (Just-In-Time Compilation) einsetzen. Häufig ausgeführte Bereiche des Bytecodes werden während der Laufzeit in Maschinencode übersetzt, der für den jeweiligen Prozessor optimiert ist.
JDK, JRE und JVM: Was ist der Unterschied?
Diese Begriffe bezeichnen unterschiedliche Bestandteile der Java-Plattform.
- JVM (Java Virtual Machine) – führt Java-Bytecode aus.
- JRE (Java Runtime Environment) – die traditionelle Bezeichnung für die zur Ausführung von Java-Anwendungen erforderliche Umgebung, bestehend aus JVM sowie zugehörigen Bibliotheken und Komponenten.
- JDK (Java Development Kit) – ein Entwicklungspaket für Java-Programme, das den Compiler und weitere Werkzeuge sowie die erforderlichen Komponenten der Laufzeitumgebung umfasst.
Beispielsweise genügt auf einem Server, der eine fertige Anwendung nur ausführen soll, eine Laufzeitumgebung mit JVM, während auf dem Rechner des Entwicklers das vollständige JDK benötigt wird.
In modernen Java-Versionen spielt die separate Bereitstellung einer universellen JRE nicht mehr dieselbe Rolle wie früher. Für Anwendungen können spezielle Runtime-Images erstellt werden, die nur die tatsächlich benötigten Java-Module enthalten.
Das Prinzip Write Once, Run Anywhere
Mit Java ist das Prinzip WORA (Write Once, Run Anywhere – „einmal schreiben, überall ausführen“) eng verbunden.
Ein Programm wird in plattformunabhängigen Bytecode kompiliert. Für seine Ausführung ist eine JVM-Implementierung für die jeweilige Plattform erforderlich.
Derselbe Bytecode kann beispielsweise potenziell ausgeführt werden unter:
- Windows;
- Linux;
- macOS;
- verschiedenen Server- und Cloud-Umgebungen.
Beispielsweise kann ein unter Windows entwickelter Dienst unverändert in einem Linux-Container im Rechenzentrum betrieben werden.
In der Praxis hängt die Portabilität zusätzlich von den verwendeten Bibliotheken, externen Komponenten und eventuell vorhandenem plattformspezifischem Code ab.
Wesentliche Eigenschaften von Java
Java ist eine statisch typisierte Programmiersprache: Die Typen von Variablen und Ausdrücken werden während der Kompilierung überprüft.
Zu den charakteristischen Eigenschaften der Sprache und Plattform gehören:
- objektorientiertes Programmiermodell;
- statische Typisierung;
- automatische Speicherverwaltung;
- Garbage Collection;
- umfangreiche Standardbibliothek;
- Unterstützung von Multithreading;
- Exception Handling;
- Portabilität des Bytecodes;
- umfangreiches Ökosystem aus Bibliotheken und Entwicklungswerkzeugen.
Beispielsweise fällt ein Tippfehler in einem Variablentyp bereits beim Kompilieren auf und nicht erst im laufenden Betrieb.
Modernes Java unterstützt neben klassischen objektorientierten Konstrukten auch verschiedene funktionale Sprachelemente, beispielsweise Lambda-Ausdrücke.
Wofür wird Java verwendet?
Java wird in unterschiedlichen Bereichen der Softwareentwicklung eingesetzt und ist insbesondere bei Server- und Unternehmenssystemen weit verbreitet.
Typische Einsatzbereiche sind:
- Backends von Webanwendungen;
- betriebliche Informationssysteme;
- Bank- und Finanzanwendungen;
- E-Commerce-Systeme;
- REST APIs und Microservices;
- Cloud-Services;
- Systeme zur Verarbeitung großer Datenmengen;
- Integrationsplattformen;
- Entwicklungswerkzeuge;
- Serverkomponenten verteilter Systeme.
Beispielsweise laufen die Kernsysteme vieler Banken und Versicherungen auf Java-Anwendungen, die über Jahre hinweg weiterentwickelt werden.
Java spielt historisch auch eine wichtige Rolle bei der Entwicklung von Android-Anwendungen, wobei in der modernen Android-Entwicklung ebenfalls häufig Kotlin eingesetzt wird.
Vorteile von Java
Zu den wesentlichen Vorteilen von Java gehören:
- Portabilität von Anwendungen zwischen verschiedenen Plattformen;
- umfangreiches Ökosystem für serverseitige Anwendungen;
- automatische Speicherverwaltung;
- große Auswahl an Bibliotheken und Frameworks;
- Unterstützung von Multithreading;
- umfangreiche Entwicklungs- und Diagnosewerkzeuge;
- Eignung für große Unternehmenssysteme;
- langfristige Weiterentwicklung der Plattform und Kompatibilität mit einer großen Menge bestehender Software.
Beispielsweise lassen sich Anwendungen, die vor vielen Jahren entwickelt wurden, häufig auch auf neueren Java-Versionen weiterbetreiben.
Java ist insbesondere für Projekte relevant, bei denen eine ausgereifte Entwicklungsinfrastruktur und die langfristige Wartbarkeit der Software eine wichtige Rolle spielen.
Einschränkungen von Java
Die Verwendung der JVM fügt zwischen Anwendung und Betriebssystem eine zusätzliche Softwareschicht ein. Dadurch kann der Speicherbedarf höher sein und die Startzeit einer Anwendung im Vergleich zu bestimmten Programmen, die direkt in Maschinencode kompiliert werden, länger ausfallen.
Zu berücksichtigen sind außerdem:
- Ressourcenverbrauch der JVM;
- Besonderheiten bei der Konfiguration des Garbage Collectors;
- Startzeit bestimmter Anwendungen;
- Abhängigkeit von einer kompatiblen Laufzeitumgebung;
- Komplexität umfangreicher Java-Ökosysteme und Enterprise-Frameworks.
Beispielsweise fällt die Startzeit der JVM bei kurzlebigen Funktionen in einer serverlosen Umgebung stärker ins Gewicht als bei einem dauerhaft laufenden Serverdienst.
Die konkreten Eigenschaften hängen jedoch stark von der jeweiligen JVM-Implementierung, der Anwendungsarchitektur und dem gewählten Technologie-Stack ab.
FAQ
Java ist eine Programmiersprache und eine damit verbundene Softwareplattform. Java-Code wird üblicherweise in Bytecode kompiliert, der von der virtuellen Maschine JVM ausgeführt wird.
Der Begriff Java wird in beiden Bedeutungen verwendet. Java ist eine Programmiersprache, während die Java Platform die JVM, Standard-APIs, Bibliotheken und weitere Komponenten für die Entwicklung und Ausführung von Anwendungen umfasst.
Für die Ausführung von gewöhnlichem Java-Bytecode ist eine kompatible Laufzeitumgebung mit JVM erforderlich. Es gibt jedoch auch Technologien, mit denen Java-Anwendungen im Voraus in nativen ausführbaren Code kompiliert werden können. Daher gilt diese Regel nicht uneingeschränkt für alle Bereitstellungsformen von Java-Anwendungen.
Nein. Es handelt sich um unterschiedliche Programmiersprachen mit unterschiedlichen Ausführungsmodellen und Einsatzbereichen. Die Ähnlichkeit der Namen ist historisch bedingt und bedeutet keine technische Verwandtschaft der Plattformen.