--- old/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp 2020-03-11 20:43:31.467420220 +0100 +++ new/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp 2020-03-11 20:43:31.359420226 +0100 @@ -294,6 +294,7 @@ template void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) { if (_heap->is_concurrent_mark_in_progress()) { + if (_heap->marking_context()->allocated_after_mark_start((HeapWord*)dst)) return; if (_heap->has_forwarded_objects()) { arraycopy_work(dst, count); } else { @@ -301,7 +302,9 @@ } } - arraycopy_update_impl(src, count); + if (_heap->has_forwarded_objects()) { + arraycopy_update_impl(src, count); + } } void ShenandoahBarrierSet::arraycopy_pre(oop* src, oop* dst, size_t count) { @@ -312,8 +315,13 @@ arraycopy_pre_work(src, dst, count); } +inline bool ShenandoahBarrierSet::skip_bulk_update(HeapWord* dst) { + return dst >= _heap->heap_region_containing(dst)->get_update_watermark(); +} + template void ShenandoahBarrierSet::arraycopy_update_impl(T* src, size_t count) { + if (skip_bulk_update(reinterpret_cast(src))) return; if (_heap->is_evacuation_in_progress()) { ShenandoahEvacOOMScope oom_evac; arraycopy_work(src, count);