On Thu, 11 Dec 2025 09:53:29 GMT, Joel Sikström <[email protected]> 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 <[email protected]> Committer: Paul Hübner <[email protected]> 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 <[email protected]> Co-authored-by: Stefan Karlsson <[email protected]> Reviewed-by: phubner, dsimms, sjohanss, stefank, coleenp ------------- PR: https://git.openjdk.org/valhalla/pull/1785
