{"id":593,"date":"2025-03-16T15:49:29","date_gmt":"2025-03-16T14:49:29","guid":{"rendered":"https:\/\/www.javaeinfacherkl\u00e4rt.de\/?p=593"},"modified":"2025-04-11T16:01:49","modified_gmt":"2025-04-11T15:01:49","slug":"class-data-sharing-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=593","title":{"rendered":"Class Data Sharing in Java"},"content":{"rendered":"\n<p>Die Java Virtual Machine (JVM) ist bekannt f\u00fcr ihre Plattformunabh\u00e4ngigkeit, Sicherheit und Performance. Letzteres wird durch kontinuierliche Optimierungen erreicht \u2013 eines dieser Features ist <strong>Class Data Sharing (CDS)<\/strong>. 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\u00f6glichkeiten.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Was ist Class Data Sharing (CDS)?<\/strong><\/h3>\n\n\n\n<p><strong>Class Data Sharing<\/strong> ist ein Feature der HotSpot JVM, das seit <strong>Java 5<\/strong> verf\u00fcgbar ist und seither stetig weiterentwickelt wurde. CDS erm\u00f6glicht das <strong>Vorabladen und Teilen von Klassendaten<\/strong> zwischen mehreren JVM-Instanzen, indem sie in einem gemeinsamen, vorkompilierten <strong>Archiv (Shared Archive File)<\/strong> gespeichert werden.<\/p>\n\n\n\n<p>Die Hauptidee besteht darin, dass viele Java-Anwendungen denselben Satz an Kernklassen laden, insbesondere solche aus dem Java-Standard-Bibliothekspaket (<code>java.*<\/code>, <code>javax.*<\/code>). Durch das gemeinsame Nutzen dieser Klassendaten \u00fcber mehrere JVM-Prozesse hinweg, lassen sich sowohl <strong>Startzeiten verk\u00fcrzen<\/strong> als auch der <strong>Speicherverbrauch reduzieren<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wie funktioniert CDS technisch?<\/strong><\/h3>\n\n\n\n<p>CDS funktioniert in mehreren Schritten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dumping Phase (Archiv-Erstellung):<\/strong><br>In dieser Phase erstellt die JVM ein Archiv, das eine vordefinierte Menge von Klassendaten enth\u00e4lt. Dies erfolgt typischerweise \u00fcber den Befehl: <code>java -Xshare:dump<\/code> Dabei wird ein Shared Archive File (z.\u202fB. <code>classes.jsa<\/code>) erzeugt, das Klassendaten aus der Bootstrap Class Loader-Hierarchie enth\u00e4lt.<\/li>\n\n\n\n<li><strong>Loading Phase (Archiv-Nutzung):<\/strong><br>Beim Starten weiterer JVM-Prozesse k\u00f6nnen diese auf das bestehende Archiv zugreifen, z.\u202fB. durch: <code>java -Xshare:on -cp myapp.jar com.example.Main<\/code> Die JVM l\u00e4dt nun die Klassendaten aus dem Archiv anstatt sie zur Laufzeit neu zu laden und zu initialisieren.<\/li>\n\n\n\n<li><strong>Verwendung eigener Archive (ab Java 10+):<\/strong><br>Entwickler k\u00f6nnen eigene <strong>benutzerdefinierte CDS-Archive<\/strong> erzeugen, die neben den Standardklassen auch Anwendungsklassen enthalten. Dies geschieht in zwei Schritten:\n<ul class=\"wp-block-list\">\n<li>Erzeugung einer Klassenliste: <code>java -Xshare:off -XX:DumpLoadedClassList=classes.lst -cp myapp.jar com.example.Main<\/code><\/li>\n\n\n\n<li>Erzeugen des Archivs: <code>java -Xshare:dump -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=myapp-cds.jsa -cp myapp.jar<\/code><\/li>\n\n\n\n<li>Nutzung: <code>java -Xshare:on -XX:SharedArchiveFile=myapp-cds.jsa -cp myapp.jar com.example.Main<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Vorteile von Class Data Sharing<\/strong><\/h3>\n\n\n\n<p>CDS bietet mehrere Vorteile, die in bestimmten Szenarien sehr wertvoll sein k\u00f6nnen:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. Schnellere Startzeit<\/strong><\/h4>\n\n\n\n<p>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.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2. Geringerer Speicherverbrauch<\/strong><\/h4>\n\n\n\n<p>Da mehrere JVM-Prozesse dasselbe Archiv nutzen, werden redundante Kopien von Klassendaten im Speicher vermieden. Dies spart physischen RAM, insbesondere bei gro\u00dfen Servern oder Container-Umgebungen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>3. Geringere CPU-Auslastung<\/strong><\/h4>\n\n\n\n<p>Die JVM muss weniger Arbeit leisten, da bereits vorbereitete Datenstrukturen verwendet werden k\u00f6nnen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>4. Verbesserte Container-Performance<\/strong><\/h4>\n\n\n\n<p>In Umgebungen wie Docker, wo viele Container dieselbe Java-Anwendung oder Bibliothek nutzen, kann CDS die Systemressourcen effizienter nutzen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>AppCDS: Anwendungsspezifische Class Data Sharing (ab Java 10)<\/strong><\/h3>\n\n\n\n<p>Seit Java 10 wurde das Feature zu <strong>AppCDS<\/strong> erweitert, sodass <strong>auch Anwendungsklassen in CDS-Archive aufgenommen werden k\u00f6nnen<\/strong>. AppCDS ist besonders in Microservice-Architekturen n\u00fctzlich, in denen viele Instanzen derselben Anwendung gleichzeitig laufen.<\/p>\n\n\n\n<p>Java 12 erleichterte die Nutzung von AppCDS, indem es erlaubte, das Archiv direkt zur Laufzeit zu erzeugen, ohne separate Schritte zur Erstellung der Klassenliste.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>CDS und JDK-Versionen<\/strong><\/h3>\n\n\n\n<p>Die M\u00f6glichkeiten und der Komfort der Nutzung von CDS haben sich mit den Java-Versionen verbessert:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Java-Version<\/th><th>CDS-Unterst\u00fctzung<\/th><th>AppCDS<\/th><th>Dynamisches Archivieren<\/th><\/tr><\/thead><tbody><tr><td>Java 5<\/td><td>Nur Bootstrap-Klassen<\/td><td>Nein<\/td><td>Nein<\/td><\/tr><tr><td>Java 8<\/td><td>Erweiterung mit AppCDS (kommerziell)<\/td><td>Teilweise<\/td><td>Nein<\/td><\/tr><tr><td>Java 10<\/td><td>AppCDS Open Source<\/td><td>Ja<\/td><td>Nein<\/td><\/tr><tr><td>Java 12+<\/td><td>Verbesserte Usability<\/td><td>Ja<\/td><td>Ja<\/td><\/tr><tr><td>Java 13+<\/td><td>Dynamisches Dumpen zur Laufzeit<\/td><td>Ja<\/td><td>Ja<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Einschr\u00e4nkungen von CDS<\/strong><\/h3>\n\n\n\n<p>Trotz der Vorteile hat CDS einige Einschr\u00e4nkungen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es unterst\u00fctzt nur <strong>nicht-modifizierte Klassendateien<\/strong>. Klassen, die zur Laufzeit ver\u00e4ndert oder generiert werden (z.\u202fB. durch Bytecode-Instrumentierung), sind nicht teilbar.<\/li>\n\n\n\n<li>Die Erzeugung und Verwaltung eigener Archive kann <strong>zus\u00e4tzliche Komplexit\u00e4t<\/strong> verursachen.<\/li>\n\n\n\n<li>Es funktioniert <strong>nicht mit allen JVM-Implementierungen<\/strong>, sondern prim\u00e4r mit <strong>HotSpot<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Fazit<\/strong><\/h3>\n\n\n\n<p><strong>Class Data Sharing<\/strong> ist ein leistungsstarkes Feature, das gerade bei wiederverwendbaren Umgebungen wie Containern, Microservices oder Cloud-Deployments Vorteile bringt. Mit der Erweiterung durch <strong>AppCDS<\/strong> und der verbesserten Integration in neueren Java-Versionen lohnt es sich, CDS in Build- und Deployment-Prozesse zu integrieren.<\/p>\n\n\n\n<p>Wer auf Performanz und Effizienz im Java-Umfeld setzt, sollte CDS definitiv in Betracht ziehen \u2013 insbesondere bei der Entwicklung gro\u00dfer oder mehrfach parallel laufender Anwendungen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Virtual Machine (JVM) ist bekannt f\u00fcr ihre Plattformunabh\u00e4ngigkeit, Sicherheit und Performance. Letzteres wird durch kontinuierliche Optimierungen erreicht \u2013 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\u00f6glichkeiten. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-593","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=593"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/593\/revisions"}],"predecessor-version":[{"id":596,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/593\/revisions\/596"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}