[lworld] Integrated: 8373494: [lworld] markWord preservation for ParallelGC
Joel Sikström
jsikstro at openjdk.org
Mon Dec 15 18:47:00 UTC 2025
On Thu, 11 Dec 2025 09:53:29 GMT, Joel Sikström <jsikstro at openjdk.org> wrote:
> Hello,
>
> The Valhalla-specific bits in the markWord need to be preserved when compacting objects in Parallel. This can easily be achieved in one of two ways:
> 1) Use the markWord from the object's Klass, which contains all relevant bits. Notably, this requires access to the Klass pointer.
> 2) Use the "PreservedMark" mechanism, preserving the markWord containing all relevant bits before compacting and restoring the markWord after comapcting.
>
> In mainline, we only ever read the markWord from the object's Klass when CompactObjectHeaders is enabled. This is perfectly fine, since CompactObjectHeaders stores the Klass pointer in the markWord and Parallel will always copy **at least** one byte of the object from the current region. All other bytes of the object may be copied in another region, in which case it is not safe to read it concurrently while another thread might compact those bytes.
>
> Now in Valhalla we also need to access the Klass pointer to get the markWord, even though we might not be using CompactObjectHeaders, which might not always be safe to do. To get around this, [JDK-8368875](https://bugs.openjdk.org/browse/JDK-8368875) opted to always use the PreservedMark mechanism instead, by changing the criteria for a markWord being preserved. Two impacts of this change stand out:
> 1) We always preserve the markWord, even though we could be able to read the Klass pointer if the full object header was copied.
> 2) Since the change was made to oopDesc::must_be_preserved(), which is not Parallel-specific, all GCs will now preserve the markWord as well for the same criteria, which is not needed.
>
> I propose we change the full reliance on the PreservedMark mechanism to a specific solution for Parallel, which preserves the markWord only when we are not guaranteed to be able to access the Klass pointer, and uses the Klass pointer when possible. This way we preserve markWords only when absolutely necessary, and other GCs also don't have to take the hit of preserving markWords unnecessarily.
>
> After this change, it has become relatively uncommon to see a markWord preserved for the new "Valhalla reason." This preservation now requires an object to cross a region boundary and to only have a single word in the current region (disregarding the use of CompactObjectHeaders). I've attempted to trigger this scenario by setting a small maximum heap size (-Xmx60M) in some tests, which sometimes results in a markWord being preserved. However, with a larger maximum heap size, it is r...
This pull request has now been integrated.
Changeset: 8c0c190b
Author: Joel Sikström <jsikstro at openjdk.org>
Committer: Paul Hübner <phubner at openjdk.org>
URL: https://git.openjdk.org/valhalla/commit/8c0c190b38ad087f92b53752c5f81257162dca8c
Stats: 75 lines in 5 files changed: 54 ins; 15 del; 6 mod
8373494: [lworld] markWord preservation for ParallelGC
Co-authored-by: Stefan Johansson <sjohanss at openjdk.org>
Co-authored-by: Stefan Karlsson <stefank at openjdk.org>
Reviewed-by: phubner, dsimms, sjohanss, stefank, coleenp
-------------
PR: https://git.openjdk.org/valhalla/pull/1785
More information about the valhalla-dev
mailing list