{"id":41327,"date":"2024-11-25T14:48:00","date_gmt":"2024-11-25T13:48:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=41327"},"modified":"2026-04-15T14:57:11","modified_gmt":"2026-04-15T12:57:11","slug":"object-headers-compressed-class-pointers","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/object-headers-compressed-class-pointers\/","title":{"rendered":"Java Object Headers und Compressed Class Pointers\u200b"},"content":{"rendered":"\n<p>Jedes Java-Objekt enth\u00e4lt im Arbeitsspeicher nicht nur die eigentlichen Daten, sondern dazu auch einen sogenannten \u201eObject Header\u201c, der vor den Daten steht. Dieser Header enth\u00e4lt z. B. den Identity Hash Code eines Objekts, Informationen \u00fcber das Alter des Objekts und einen Verweis auf die Klasse, die durch dieses Objekt instanziiert wurde.<\/p>\n\n\n\n<p>In diesem Artikel erf\u00e4hrst du:<\/p>\n\n\n\n<ul class=\"wp-block-list hc-checked-list\">\n<li>Wie ist der Object Header aufgebaut? <\/li>\n\n\n\n<li>Was sind Mark Word und Class Word?<\/li>\n\n\n\n<li>Was ist der Compressed Class Space?<\/li>\n\n\n\n<li>Wie k\u00f6nnen Compressed Class Pointers auf einem 64-Bit-System mit nur 32 Bit dargestellt werden?<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-uagb-info-box uagb-block-76088612 uagb-infobox__content-wrap  uagb-infobox-icon-left uagb-infobox-left uagb-infobox-stacked-mobile uagb-infobox-image-valign-top hc-infobox\"><div class=\"uagb-ifb-icon-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z\"><\/path><\/svg><\/div><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-title-wrap\"><\/div><p class=\"uagb-ifb-desc\">Dieser Artikel beschreibt den Aufbau des Objekt-Headers zum Stand von <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-24-features\/\">Java 24<\/a>, d. h. bevor dieser durch sogenannte \u201e<a href=\"https:\/\/www.happycoders.eu\/de\/java\/compact-object-headers\/\">Compact Object Headers<\/a>\u201c weiter komprimiert wird. Compact Object Headers werden im Rahmen von <a href=\"https:\/\/wiki.openjdk.org\/spaces\/lilliput\/overview\" target=\"_blank\" rel=\"noreferrer noopener\">Project Lilliput<\/a> erstmals in Java 24 aktiviert werden k\u00f6nnen.<\/p><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"aufbau-des-java-objekt-headers\">Aufbau des Java Objekt-Headers<\/h2>\n\n\n\n<p>Der Java Object Header besteht aus einem sogenannten \u201eMark Word\u201c und einem \u201eClass Word\u201c. Auf einem 64-Bit-System mit <em>nicht <\/em>komprimierten Klassen-Pointern belegt der Header 128 Bit \u2013 also 16 Byte \u2013 und hat folgenden Aufbau:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"148\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-800x148.png\" alt=\"Java Object Header: 64-Bit Mark Word und 64-Bit Class Word, gesamt: 128 Bit\" class=\"wp-image-41345\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-800x148.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-224x41.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-336x62.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-504x93.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-672x124.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-400x74.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-600x111.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-944x175.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4-1200x222.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-128-bits.v4.png 1601w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p><em>Mit <\/em>komprimierten Klassen-Pointern (was das genau bedeutet, erkl\u00e4re ich dir im Abschnitt <a href=\"#compressed-class-pointers\">Compressed Class Pointers<\/a>) ist das Class Word nur 32 Bit lang \u2013 und damit der gesamte Objekt-Header nicht mehr 128 Bit, sondern nur noch 96 Bit \u2013 also 12 Byte:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"148\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-800x148.png\" alt=\"Java Object Header: 64-Bit Mark Word und 32-Bit komprimiertes Class Word, gesamt: 96 Bit\" class=\"wp-image-41347\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-800x148.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-224x41.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-336x62.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-504x93.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-672x124.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-400x74.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-600x111.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-944x175.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits-1200x222.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-96-bits.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Welche Daten enthalten Mark Word und Class Word, und wie sind sie aufgebaut?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"mark-word\">Mark Word<\/h2>\n\n\n\n<p>Schauen wir uns zun\u00e4chst das Mark Word im Detail an (beachte, dass ich den Ma\u00dfstab gegen\u00fcber den vorherigen Grafiken ge\u00e4ndert habe, um die Details besser darzustellen):<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"174\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-800x174.png\" alt=\"Java Mark Word Layout\" class=\"wp-image-41352\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-800x174.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-224x49.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-336x73.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-504x110.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-672x146.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-400x87.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-600x131.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-944x205.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-1200x261.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Das Mark Word enth\u00e4lt in der Regel die folgenden Informationen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>25 ungenutzte Bits.<\/li>\n\n\n\n<li>31 Bit f\u00fcr den Identity Hash Code des Objekts \u2013 das ist der Wert, der durch <code>System.identityHashCode(Object)<\/code> zur\u00fcckgegeben wird.<\/li>\n\n\n\n<li>1 ungenutztes Bit \u2013 dieses wurde durch den bereits <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-14-features\/#Remove_the_Concurrent_Mark_Sweep_CMS_Garbage_Collector\">in Java 14 entfernten Concurrent Mark Sweep (CMS) Garbage Collector<\/a> bei Komprimierung des Class Words (s. u.) genutzt.<\/li>\n\n\n\n<li>4 Bits, in denen der Garbage Collector das Alter des Objekts speichert, anhand dessen er entscheidet, wann ein Objekt von der jungen in die alte Generation verschoben wird.<\/li>\n\n\n\n<li>1 ungenutztes Bit \u2013 dieses wurde f\u00fcr das <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-15-features\/#Disable_and_Deprecate_Biased_Locking\">in Java 15 deaktivierte Biased Locking<\/a> verwendet.<\/li>\n\n\n\n<li>2 Bits f\u00fcr den Lock-Zustand des Objekts (\u201eTag Bits\u201c).<\/li>\n<\/ul>\n\n\n\n<p>Beim veralteten \u201eLegacy Stack Locking\u201c konnte sich das Mark Word auch \u00e4ndern \u2013 wie, das erkl\u00e4re ich im n\u00e4chtsen Abschnitt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"legacy-stack-locking\">Legacy Stack Locking<\/h3>\n\n\n\n<p>Beim \u201eLegacy Stack Locking\u201c (dem Standard-Locking-Mechanismus bis <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-22-features\/\">Java 22<\/a>) werden im <em>gelockten<\/em> Zustand (d. h. wenn sich ein Thread innerhalb eines <code>synchronized<\/code>-Blocks befindet, der auf diesem Objekt definiert wurde), die ersten 62 Bit des Mark Words durch einen Pointer auf eine zus\u00e4tzliche Datenstruktur auf dem Stack ersetzt:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"350\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state.png\" alt=\"Java Mark Word in locked state\" class=\"wp-image-41353\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state.png 1600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-224x49.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-336x74.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-504x110.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-672x147.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-400x88.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-600x131.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-800x175.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-944x207.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-mark-word-in-locked-state-1200x263.png 1200w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<p>Diese Datenstruktur enth\u00e4lt dann wiederum das eigentliche Mark Word sowie weitere Informationen \u00fcber das Lock, wie z. B. eine Liste der Threads, die blockiert wurden und darauf warten, den <code>synchronized<\/code>-Block betreten zu d\u00fcrfen.<\/p>\n\n\n\n<div class=\"wp-block-uagb-info-box uagb-block-3bbf1cd1 uagb-infobox__content-wrap  uagb-infobox-icon-left uagb-infobox-left uagb-infobox-stacked-mobile uagb-infobox-image-valign-top hc-infobox\"><div class=\"uagb-ifb-icon-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z\"><\/path><\/svg><\/div><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-title-wrap\"><\/div><p class=\"uagb-ifb-desc\">Der Pointer zu dieser separaten Datenstruktur ist \u00fcbrigens einer von zwei Gr\u00fcnden f\u00fcr das <a href=\"https:\/\/www.happycoders.eu\/de\/java\/virtual-threads\/#2-pinning\">Pinning bei virtuellen Threads<\/a>: Ein virtueller Thread, der innerhalb eines <code>synchronized<\/code>-Blocks blockierenden Code aufruft, darf nicht vom Carrier Thread gel\u00f6st werden.<br><br>Denn wenn der virtuelle Thread danach auf einem anderen Carrier Thread weiterlaufen w\u00fcrde (dessen Stack an einer anderen Adresse im Speicher liegt), w\u00e4re dieser Pointer nicht mehr g\u00fcltig.<\/p><\/div><\/div>\n\n\n\n<p>Da das \u201eLegacy Stack Locking\u201c den Zugriff auf die eigentlichen Daten des Mark Words erschwerte und mit ein Grund f\u00fcr das o. g. Pinning war, wurde es durch das modernere \u201eLightweight Locking\u201c ersetzt. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"lightweight-locking\">Lightweight Locking<\/h3>\n\n\n\n<p>Seit <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-21-features\/#Implement_Alternative_Fast-Locking_Scheme\">Java 21<\/a> gibt es das sogenannte \u201eLightweight Locking\u201c, das ohne \u00c4nderung des Mark Words auskommt. Seit <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-23-features\/#Change_LockingMode_default_from_LM_LEGACY_to_LM_LIGHTWEIGHT\">Java 23<\/a> ist dies der Standard-Modus.<\/p>\n\n\n\n<p>Beim Lightweight Locking werden \u2013 sofern kein anderer Thread den kritischen Bereich betreten will \u2013 lediglich die <em>Tag Bits<\/em> (die letzten zwei Bits des Mark Words) von <code>0x01<\/code> (unlocked) auf <code>0x00<\/code> (lightweight-locked) ge\u00e4ndert. Es wird keine zus\u00e4tzliche Datenstruktur angelegt.<\/p>\n\n\n\n<p>Erst wenn ein weiterer Thread versucht den kritischen Bereich zu betreten, wird das Lock \u201einflated\u201c (auf deutsch k\u00f6nnte man sagen: \u201eaufgebl\u00e4ht\u201c): <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine zus\u00e4tzliche Datenstruktur, die u. a. eine Liste der wartenden Threads enth\u00e4lt, wird erstellt.<\/li>\n\n\n\n<li>Der Pointer auf diese Datenstruktur wird in einer separaten Hashtable abgelegt und nicht mehr im Mark Word \u2013 die Inflation des Locks wird dort lediglich durch die \u00c4nderung der <em>Tag Bits <\/em>auf <code>0x10<\/code> angezeigt.<\/li>\n<\/ul>\n\n\n\n<p>Lightweight Locking ist also eine effizientere M\u00f6glichkeit zur Synchronisierung von Threads, indem es die \u00c4nderung des Mark Words \u00fcberfl\u00fcssig macht und den Overhead unn\u00f6tiger Monitor-Objekte in Szenarien ohne Thread Contention (d. h. dass keine Threads auf andere warten) reduziert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"class-word\">Class Word<\/h2>\n\n\n\n<p>Das Class Word (manchmal auch \u201eKlass Word\u201c) ist schnell erkl\u00e4rt:<\/p>\n\n\n\n<p>Es enth\u00e4lt einen Pointer auf die sogenannte <em>Klass<\/em>-Datenstruktur im Metaspace \u2013 einem Speicherbereich au\u00dferhalb des Java-Heaps. Diese Datenstruktur enth\u00e4lt alle relevanten Informationen \u00fcber die Klasse des Objekts. Alle Objekte derselben Klasse, z. B. alle <code>ArrayList<\/code>-Objekte, zeigen auf dieselbe <em>Klass<\/em>-Datenstruktur.<\/p>\n\n\n\n<p>Auf einem 64-Bit-System ist auch dieser Pointer (sofern er nicht komprimiert wird \u2013 dazu kommen wir gleich) 64 Bit gro\u00df:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"153\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-800x153.png\" alt=\"Java Class Word, nicht komprimiert, 64 Bits\" class=\"wp-image-41523\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-800x153.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-224x43.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-336x64.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-504x96.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-672x129.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-400x77.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-600x115.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-944x181.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2-1200x230.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-64-bit.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Mit diesen 64 Bit lassen sich 16 EB (16 Exabyte = 18.446.744.073.709.551.616 Bytes) adressieren. Eine <em>Klass<\/em>-Datenstruktur ist in der Regel zwischen einem halben und einem Kilobyte gro\u00df. Mit 64 Bit k\u00f6nnten wir also 2<sup>64<\/sup> \/ 768 = 24 Billiarden Klassen referenzieren. Das ist eine Zahl, die vermutlich auch in 30 Jahren noch sehr gro\u00df erscheint.<\/p>\n\n\n\n<p>Daher wurden der sogenannte \u201eCompressed Class Space\u201c und \u201eCompressed Class Pointers\u201c eingef\u00fchrt, die ich in den n\u00e4chsten zwei Abschnitten beschreiben werde.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"compressed-class-space\">Compressed Class Space<\/h2>\n\n\n\n<p>Der \u201eCompressed Class Space\u201c ist ein zusammenh\u00e4ngender Speicherblock innerhalb des Metaspaces (einem Speicherbereich au\u00dferhalb des Heaps), in dem alle <em>Klass<\/em>-Datenstrukturen abgelegt sind. Dieser Bereich wird beim Start eines Java-Programms allokiert, und seine Gr\u00f6\u00dfe kann sich w\u00e4hrend der Laufzeit nicht \u00e4ndern.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"116\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-800x116.png\" alt=\"Java Speicherlayout: Heap, Metaspace, Compressed Class Space, C Heap, Thread Stack\" class=\"wp-image-41537\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-800x116.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-224x32.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-504x73.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-672x97.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-400x58.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-600x87.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-944x137.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2-1200x174.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-compressed-class-space.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Standardm\u00e4\u00dfig ist der Compressed Class Space 1 GB gro\u00df. Seine Gr\u00f6\u00dfe kann mit der folgenden VM-Option ge\u00e4ndert werden:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>-XX:CompressedClassSpaceSize=&lt;size&gt;<\/code><\/p>\n\n\n\n<p>Erlaubt sind Werte zwischen 1 MB und 4 GB.<\/p>\n\n\n\n<p>Der Name \u201eCompressed Class Space\u201c ist irref\u00fchrend, da nicht die <em>Klass<\/em>-Datenstrukturen selbst komprimiert sind, sondern die Pointer vom Class Word des Object Headers auf diese <em>Klass<\/em>-Datenstrukturen. Dazu mehr im n\u00e4chsten Abschnitt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"compressed-class-pointers\">Compressed Class Pointers<\/h2>\n\n\n\n<p>Wie im vorherigen Abschnitt erw\u00e4hnt, kann der Compressed Class Space maximal 4 GB gro\u00df sein. Um 4 GB zu adressieren, gen\u00fcgen 32 Bit (2<sup>32<\/sup> = 4.294.967.296).<\/p>\n\n\n\n<p>Ein Compressed Class Pointer ist somit ein 32-Bit-Wert, der die Adresse der <em>Klass<\/em>-Datenstruktur als Offset innerhalb des Compressed Class Spaces beschreibt:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"166\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-800x166.png\" alt=\"Java Class Word, 32 Bits, mit Compressed Class Pointer\" class=\"wp-image-41525\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-800x166.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-224x46.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-336x70.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-504x105.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-672x139.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-400x83.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-600x125.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-944x196.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2-1200x249.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-class-word-32-bit-compressed-class-pointer.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Die tats\u00e4chliche Adresse der <em>Klass<\/em>-Datenstruktur ergibt sich durch Addition der Startadresse des Compressed Class Spaces und dieses Offsets.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"compressed-class-pointers-sind-standardmaessig-aktiviert\">Compressed Class Pointers sind standardm\u00e4\u00dfig aktiviert<\/h3>\n\n\n\n<p>Auf einem 64-Bit-System sind komprimierte Klassen-Pointer standardm\u00e4\u00dfig aktiviert. Du kannst sie mit folgender Option deaktivieren:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>-XX:-UseCompressedClassPointers<\/code><\/p>\n\n\n\n<p>Es gibt allerdings keinen Grund das zu tun, denn mit komprimierten Pointern lassen sich ca. 6 Millionen Klassen adressieren \u2013 und selbst gro\u00dfe Java-Anwendungen benutzen selten mehr als 100.000 Klassen. Aus diesem Grund wird diese Option in <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-25-features\/#the-usecompressedclasspointers-option-is-deprecated\">Java 25<\/a> als <em>deprecated<\/em> markiert.<\/p>\n\n\n\n<div class=\"wp-block-uagb-info-box uagb-block-c18ba2f6 uagb-infobox__content-wrap  uagb-infobox-icon-left uagb-infobox-left uagb-infobox-stacked-mobile uagb-infobox-image-valign-top hc-infobox\"><div class=\"uagb-ifb-icon-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z\"><\/path><\/svg><\/div><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-title-wrap\"><\/div><p class=\"uagb-ifb-desc\">Bis Java 14 war die Aktivierung von Compressed Class Pointers an die Aktivierung von <a href=\"https:\/\/www.happycoders.eu\/de\/java\/compressed-oops\/\">Compressed OOPs<\/a> (komprimierte Objekt-Pointer) gekoppelt. Wenn man Compressed OOPs deaktivierte, wurden automatisch auch Compressed Class Pointers deaktiviert. Da es keinen Grund f\u00fcr diese Kopplung gab, wurde sie in <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-15-features\/#Keine_Kopplung_von_Compressed_Oops_und_Compressed_Class_Pointers\">Java 15<\/a> aufgehoben.<\/p><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ausblick-compact-object-headers\">Ausblick: Compact Object Headers<\/h2>\n\n\n\n<p>Seit mehreren Jahren wird im Rahmen von <a href=\"https:\/\/wiki.openjdk.org\/spaces\/lilliput\/overview\" target=\"_blank\" rel=\"noreferrer noopener\">Project Lilliput<\/a> daran gearbeitet, die Objekt-Header in Java weiter zu verkleinern \u2013 zun\u00e4chst auf 64 Bit, sp\u00e4ter eventuell sogar auf 32 Bit.<\/p>\n\n\n\n<p>Der erste Meilenstein ist erreicht. In <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-25-features\/#compact-object-headers-jep-519\">Java 25<\/a> werden <a href=\"https:\/\/www.happycoders.eu\/de\/java\/compact-object-headers\/\">Compact Object Headers<\/a> ver\u00f6ffentlicht, und damit kann die Header-Gr\u00f6\u00dfe auf 64 Bit reduziert werden.<\/p>\n<aside><p>Wenn dir der Artikel weitergeholfen hat, w\u00fcrde ich mich sehr \u00fcber eine positive Bewertung auf meinem <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">ProvenExpert-Profil<\/a> freuen. Dein Feedback hilft mir, meine Inhalte weiter zu verbessern und motiviert mich, neue informative Artikel zu schreiben.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">Bewertung abgeben<\/a><\/p>\r\n                        <p>Du m\u00f6chtest \u00fcber alle neue Java-Features auf dem Laufenden sein? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"#\" data-formkit-toggle=\"d8ee997126\">Newsletter-Anmeldung<\/a><\/p><\/aside>","protected":false},"excerpt":{"rendered":"<p>Wie ist ein Java Object Header aufgebaut? Was sind Mark Word und Class Word? Wie k\u00f6nnen Compressed Class Pointers auf einem 64-Bit-System mit nur 32 Bit dargestellt werden?<\/p>\n","protected":false},"author":1,"featured_media":41330,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie ist ein Java Object Header aufgebaut? Was sind Mark Word, Class Word und Compressed Class Pointers?","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"java object header,java object headers,compressed class pointer,compressed class pointers,compressed class space","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":8259,"_post_count":0,"footnotes":""},"categories":[64],"tags":[165],"class_list":["post-41327","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-fortgeschritten"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2024\/11\/java-object-header-compressed-oops.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Wie ist ein Java Object Header aufgebaut? Was sind Mark Word und Class Word? Wie k\u00f6nnen Compressed Class Pointers auf einem 64-Bit-System mit nur 32 Bit dargestellt werden?","public_identification_id":"1730d3da430743bb8cd95415afc1b0c5","private_identification_id":"f50eb4fbc676400daaa3a9c21919ddde","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/41327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=41327"}],"version-history":[{"count":12,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/41327\/revisions"}],"predecessor-version":[{"id":56050,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/41327\/revisions\/56050"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/41330"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=41327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=41327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=41327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}