A user reported misbehaving off-heap access. It looks like a C2 compilation failure that seems to only trigger with Shenandoah:
https://mail.openjdk.java.net/pipermail/shenandoah-dev/2019-March/009060.html
Eg with G1 generates this assembly for swapping two array elements:
mov (%r8),%r9d
mov (%r10),%r11d
mov %r9d,(%r10)
mov %r11d,(%r8)
While with Shenandoah we get this:
mov (%r9),%ecx
mov %ecx,(%r10,%r11,1)
mov %ecx,(%r9)
I.e. the two loads seem to have been wrongly coalesced into one.
Even though that is only triggered by Shenandoah, it seems to be a legit and generic C2 problem.