> 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

Reply via email to