diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAllocator.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAllocator.cpp index e3d9a072795..09109561f8f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAllocator.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocator.cpp @@ -372,7 +372,7 @@ HeapWord* ShenandoahAllocator::allocate(ShenandoahAllocRequest } template -void ShenandoahAllocator::release_alloc_regions() { +void ShenandoahAllocator::release_alloc_regions(bool should_update_accounting) { assert_at_safepoint(); shenandoah_assert_heaplocked(); @@ -401,7 +401,7 @@ void ShenandoahAllocator::release_alloc_regions() { if (total_regions_to_unretire > 0) { _free_set->partitions()->decrease_used(ALLOC_PARTITION, total_free_bytes); _free_set->partitions()->increase_region_counts(ALLOC_PARTITION, total_regions_to_unretire); - accounting_updater._need_update = true; + accounting_updater._need_update = should_update_accounting; } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAllocator.hpp b/src/hotspot/share/gc/shenandoah/shenandoahAllocator.hpp index 8ec89189518..3e4fa13ca1b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAllocator.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocator.hpp @@ -141,7 +141,7 @@ public: // Caller must hold the heap lock at safepoint. This causes all directly allocatable regions to be placed into // the appropriate ShenandoahFreeSet partition. // Collector calls this in preparation for choosing a collection set and/or rebuilding the freeset. - virtual void release_alloc_regions(); + virtual void release_alloc_regions(bool should_update_accounting = true); // Caller must hold the heap lock at safepoint. This causes us to set aside N regions as directly allocatable // by removing these regions from the relevant ShenandoahFreeSet partitions. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp index 6b1155ae8e5..82809068dd7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -851,15 +851,15 @@ public: return _old_collector_allocator; } - void release_alloc_regions() { - mutator_allocator()->release_alloc_regions(); - collector_allocator()->release_alloc_regions(); + void release_alloc_regions(bool should_update_accounting = true) { + mutator_allocator()->release_alloc_regions(should_update_accounting); + collector_allocator()->release_alloc_regions(should_update_accounting); } - void release_alloc_regions_under_lock() { + void release_alloc_regions_under_lock(bool should_update_accounting = true) { shenandoah_assert_not_heaplocked(); ShenandoahHeapLocker locker(_heap->lock()); - release_alloc_regions(); + release_alloc_regions(should_update_accounting); } // Handle allocation for collector (for evacuation). diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp index e90a19bc51c..e126dddae87 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp @@ -217,7 +217,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { heap->tlabs_retire(ResizeTLAB); } - heap->free_set()->release_alloc_regions_under_lock(); + heap->free_set()->release_alloc_regions_under_lock(false); OrderAccess::fence();