RFR: 8376822: UseCompactObjectHeaders: fill Klass alignment gaps in AOT cache

Ioi Lam iklam at openjdk.org
Mon Feb 23 00:29:26 UTC 2026


When  `UseCompactObjectHeaders` is enabled, `Klass` objects must be aligned by 1024 bytes. This leaves many gaps in the "rw" region of the AOT cache.

This PR manages the gaps using an `RBTree`. The gaps are sorted in ascending sizes. Gaps of the same size are sorted in ascending addresses. When allocating a small object, we try to find a suitable gap with the lowest address.

Because we have lots of small metaspace objects in the AOT cache, the gaps are always filled. We save abuot 5% of footprint with the JDK's default CDS archive (777KB out of 15.7MB):


$ java -Xshare:dump -XX:+UseCompactObjectHeaders -Xlog:aot,aot+alloc=trace | grep -i gap | tail -2
[0.407s][trace][aot,alloc] 8 bytes @ 0x716e804623f0 in a gap of 8 bytes (used gaps 10293 times, remain gap = 0 bytes in 0 blocks)
[0.443s][info ][aot      ] Allocated 10293 objects of 777264 bytes in gaps
$ ls -l images/jdk/lib/server/classes_coh.jsa 
-rw-rw-r-- 1 iklam iklam 15704064 Feb 22 16:17 images/jdk/lib/server/classes_coh.jsa


Related changes

- Address sorting added to AOTMapLogger
- The null assertion in `ArchivePtrMarker::mark_pointer()` was wrong for the dynamic archive (`ptr_base()` points to the bottom of the dynamic archive, not the bottom of the AOT metaspace).

-------------

Commit messages:
 - 8376822: UseCompactObjectHeaders: fill Klass alignment gaps in AOT cache

Changes: https://git.openjdk.org/jdk/pull/29869/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29869&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8376822
  Stats: 314 lines in 8 files changed: 236 ins; 62 del; 16 mod
  Patch: https://git.openjdk.org/jdk/pull/29869.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29869/head:pull/29869

PR: https://git.openjdk.org/jdk/pull/29869


More information about the hotspot-dev mailing list