--- old/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp 2020-04-22 11:59:02.304924989 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp 2020-04-22 11:59:02.100924913 +0200 @@ -293,11 +293,14 @@ template void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) { - if (_heap->is_concurrent_mark_in_progress()) { + if (_heap->is_concurrent_mark_in_progress() && + !_heap->marking_context()->allocated_after_mark_start(reinterpret_cast(dst))) { arraycopy_work(dst, count); } - 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) { @@ -308,8 +311,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);