> 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...
Joel Sikström has updated the pull request incrementally with three additional commits since the last revision: - Extract markWord preservation into static method - Don't pass words_remaining to safe_mark_word_prototype - Rename safe_mark_prototype to safe_mark_word_prototype ------------- Changes: - all: https://git.openjdk.org/valhalla/pull/1785/files - new: https://git.openjdk.org/valhalla/pull/1785/files/e9d214c3..6623c627 Webrevs: - full: https://webrevs.openjdk.org/?repo=valhalla&pr=1785&range=03 - incr: https://webrevs.openjdk.org/?repo=valhalla&pr=1785&range=02-03 Stats: 36 lines in 1 file changed: 19 ins; 12 del; 5 mod Patch: https://git.openjdk.org/valhalla/pull/1785.diff Fetch: git fetch https://git.openjdk.org/valhalla.git pull/1785/head:pull/1785 PR: https://git.openjdk.org/valhalla/pull/1785
