Die Java Virtual Machine (JVM) ist bekannt für ihre Plattformunabhängigkeit, Sicherheit und Performance. Letzteres wird durch kontinuierliche Optimierungen erreicht – eines dieser Features ist Class Data Sharing (CDS). Mit CDS lassen sich sowohl Startzeit als auch Speicherverbrauch von Java-Anwendungen verbessern. In diesem Artikel werfen wir einen detaillierten Blick auf CDS, seine Funktionsweise, Vorteile und Einsatzmöglichkeiten.


Was ist Class Data Sharing (CDS)?

Class Data Sharing ist ein Feature der HotSpot JVM, das seit Java 5 verfügbar ist und seither stetig weiterentwickelt wurde. CDS ermöglicht das Vorabladen und Teilen von Klassendaten zwischen mehreren JVM-Instanzen, indem sie in einem gemeinsamen, vorkompilierten Archiv (Shared Archive File) gespeichert werden.

Die Hauptidee besteht darin, dass viele Java-Anwendungen denselben Satz an Kernklassen laden, insbesondere solche aus dem Java-Standard-Bibliothekspaket (java.*, javax.*). Durch das gemeinsame Nutzen dieser Klassendaten über mehrere JVM-Prozesse hinweg, lassen sich sowohl Startzeiten verkürzen als auch der Speicherverbrauch reduzieren.


Wie funktioniert CDS technisch?

CDS funktioniert in mehreren Schritten:

  1. Dumping Phase (Archiv-Erstellung):
    In dieser Phase erstellt die JVM ein Archiv, das eine vordefinierte Menge von Klassendaten enthält. Dies erfolgt typischerweise über den Befehl: java -Xshare:dump Dabei wird ein Shared Archive File (z. B. classes.jsa) erzeugt, das Klassendaten aus der Bootstrap Class Loader-Hierarchie enthält.
  2. Loading Phase (Archiv-Nutzung):
    Beim Starten weiterer JVM-Prozesse können diese auf das bestehende Archiv zugreifen, z. B. durch: java -Xshare:on -cp myapp.jar com.example.Main Die JVM lädt nun die Klassendaten aus dem Archiv anstatt sie zur Laufzeit neu zu laden und zu initialisieren.
  3. Verwendung eigener Archive (ab Java 10+):
    Entwickler können eigene benutzerdefinierte CDS-Archive erzeugen, die neben den Standardklassen auch Anwendungsklassen enthalten. Dies geschieht in zwei Schritten:
    • Erzeugung einer Klassenliste: java -Xshare:off -XX:DumpLoadedClassList=classes.lst -cp myapp.jar com.example.Main
    • Erzeugen des Archivs: java -Xshare:dump -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=myapp-cds.jsa -cp myapp.jar
    • Nutzung: java -Xshare:on -XX:SharedArchiveFile=myapp-cds.jsa -cp myapp.jar com.example.Main

Vorteile von Class Data Sharing

CDS bietet mehrere Vorteile, die in bestimmten Szenarien sehr wertvoll sein können:

1. Schnellere Startzeit

Ein erheblicher Teil der Startzeit von Java-Anwendungen wird durch das Parsen, Verifizieren und Initialisieren von Klassendaten verursacht. Da CDS diese Schritte im Voraus erledigt, reduziert sich die Startzeit signifikant.

2. Geringerer Speicherverbrauch

Da mehrere JVM-Prozesse dasselbe Archiv nutzen, werden redundante Kopien von Klassendaten im Speicher vermieden. Dies spart physischen RAM, insbesondere bei großen Servern oder Container-Umgebungen.

3. Geringere CPU-Auslastung

Die JVM muss weniger Arbeit leisten, da bereits vorbereitete Datenstrukturen verwendet werden können.

4. Verbesserte Container-Performance

In Umgebungen wie Docker, wo viele Container dieselbe Java-Anwendung oder Bibliothek nutzen, kann CDS die Systemressourcen effizienter nutzen.


AppCDS: Anwendungsspezifische Class Data Sharing (ab Java 10)

Seit Java 10 wurde das Feature zu AppCDS erweitert, sodass auch Anwendungsklassen in CDS-Archive aufgenommen werden können. AppCDS ist besonders in Microservice-Architekturen nützlich, in denen viele Instanzen derselben Anwendung gleichzeitig laufen.

Java 12 erleichterte die Nutzung von AppCDS, indem es erlaubte, das Archiv direkt zur Laufzeit zu erzeugen, ohne separate Schritte zur Erstellung der Klassenliste.


CDS und JDK-Versionen

Die Möglichkeiten und der Komfort der Nutzung von CDS haben sich mit den Java-Versionen verbessert:

Java-VersionCDS-UnterstützungAppCDSDynamisches Archivieren
Java 5Nur Bootstrap-KlassenNeinNein
Java 8Erweiterung mit AppCDS (kommerziell)TeilweiseNein
Java 10AppCDS Open SourceJaNein
Java 12+Verbesserte UsabilityJaJa
Java 13+Dynamisches Dumpen zur LaufzeitJaJa

Einschränkungen von CDS

Trotz der Vorteile hat CDS einige Einschränkungen:

  • Es unterstützt nur nicht-modifizierte Klassendateien. Klassen, die zur Laufzeit verändert oder generiert werden (z. B. durch Bytecode-Instrumentierung), sind nicht teilbar.
  • Die Erzeugung und Verwaltung eigener Archive kann zusätzliche Komplexität verursachen.
  • Es funktioniert nicht mit allen JVM-Implementierungen, sondern primär mit HotSpot.

Fazit

Class Data Sharing ist ein leistungsstarkes Feature, das gerade bei wiederverwendbaren Umgebungen wie Containern, Microservices oder Cloud-Deployments Vorteile bringt. Mit der Erweiterung durch AppCDS und der verbesserten Integration in neueren Java-Versionen lohnt es sich, CDS in Build- und Deployment-Prozesse zu integrieren.

Wer auf Performanz und Effizienz im Java-Umfeld setzt, sollte CDS definitiv in Betracht ziehen – insbesondere bei der Entwicklung großer oder mehrfach parallel laufender Anwendungen.