8377137: Support large CDS archives with UseCompactObjectHeaders#29556
Closed
XueleiFan wants to merge 6 commits intoopenjdk:masterfrom
Closed
8377137: Support large CDS archives with UseCompactObjectHeaders#29556XueleiFan wants to merge 6 commits intoopenjdk:masterfrom
XueleiFan wants to merge 6 commits intoopenjdk:masterfrom
Conversation
|
👋 Welcome back xuelei! A progress list of the required criteria for merging this PR into |
|
❗ This change is not yet ready to be integrated. |
|
@XueleiFan The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Core Problem
With
UseCompactObjectHeaders, each Java object header contains a 22-bit narrow Klass ID (plus 10-bit shift), limiting the Klass encoding range to 4GB. CDS archives store pre-computed narrow Klass IDs in:Two issues arise:
Key Insight
Only Klass objects need narrow Klass encoding — they are referenced from object headers via 22-bit IDs. Other metadata (Methods, ConstantPools, Symbols, etc.) are accessed through regular 64-bit pointers and can reside anywhere in memory.
Solution: Two-Part Approach
Part 1: Klass Region Separation (Dump Time)
Logically separate Klass objects from other metadata:
This allows archives to grow beyond 4GB while keeping Klasses within the encoding range.
Part 2: Narrow Klass ID Remapping (Load Time)
When the archive is mapped at a different address than requested:
The remapping formula:
Memory Layout
For large archives, use split encoding mode where class space is placed before the archive:
This maximizes the usable encoding range by starting from class_space and only requiring the Klass region (not the entire archive) to be reachable.
Result
Parallel Narrow Klass ID Patching
Added parallel patching of narrow Klass IDs in archived heap objects during AOT cache loading, following the same ArchiveWorkerTask pattern used by SharedDataRelocationTask. Pre-computes object boundaries at chunk splits, then workers process their ranges in parallel.
Benchmark (3.4GB archive): 1.85x speedup for relocation (189ms vs 350ms), 1.24x overall startup improvement (662ms vs 535ms), by using 3 threads on 12-core machine
Progress
Issue
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/29556/head:pull/29556$ git checkout pull/29556Update a local copy of the PR:
$ git checkout pull/29556$ git pull https://git.openjdk.org/jdk.git pull/29556/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 29556View PR using the GUI difftool:
$ git pr show -t 29556Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/29556.diff