RFR: 8364159: Shenandoah assertions after JDK-8361712

Thomas Stuefe stuefe at openjdk.org
Tue Jul 29 13:48:53 UTC 2025


On Tue, 29 Jul 2025 13:05:32 GMT, Matthias Baesken <mbaesken at openjdk.org> wrote:

>> In `ShenandoahAsserts::extract_klass_safely`, we attempt to carefully extract the Klass for an object and trip over our own feet doing this. We load the Markword twice: once to read "is_marked" and get the forwardee, once to extract the narrowKlass.
>> 
>> If between the first and the second load we did evacuate the object concurrently, this happens:
>> 
>> T1 : fwd = SheandoahForwarding::get_forwardee_raw_unchecked(obj)  => obj unmarked => (fwd == obj)
>> T2 : (installs forwarding pointer in obj)
>> T1: read markword from fwd again, (fwd == obj) => reads markword from forwarded obj, interprets the zeros in the upper part of the forwardee address as narrowKlass == 0, asserts
>> 
>> The solution is - as ShenandoahForwarding::klass() already does - to load the MW from original obj only once. Patch does that.
>
> Thanks for fixing this, I checked for similar code locations but could not find any (hope I did not overlook something).
> The fix fixes our various asserts we saw across jtreg HS tests when enabling CompressedObjectHeaders by default,

Thanks @MBaesken ! My own tests are also clean now. 

Any shenandoah devs willing to give me a quick review?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/26513#issuecomment-3132612591


More information about the hotspot-gc-dev mailing list