diff -r 04946947ca79 -r 3f35a9efd7de src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Wed Oct 16 11:12:47 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Oct 18 13:07:46 2019 -0400 @@ -262,7 +262,7 @@ } } -oop ShenandoahBarrierSet::oop_load_from_native_barrier(oop obj) { +oop ShenandoahBarrierSet::oop_load_from_native_barrier(oop obj, oop* load_addr) { if (CompressedOops::is_null(obj)) { return NULL; } @@ -277,7 +277,13 @@ } } - return load_reference_barrier_not_null(obj); + oop fwd = load_reference_barrier_not_null(obj); + if (load_addr != NULL && fwd != obj) { + // Since we are here and we know the load address, update the reference. + ShenandoahHeap::cas_oop(fwd, load_addr, obj); + } + + return fwd; } void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {