# HG changeset patch # User rkennke # Date 1517429912 -3600 # Wed Jan 31 21:18:32 2018 +0100 # Node ID ae7fcccd7ad522630cafb96dafd6966d1dd96297 # Parent af9272163588fc840978f67f3d88eae8c76ecfd0 Don't treat allocation regions implicitely live during traversal GC diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp @@ -97,7 +97,7 @@ if (result != NULL) { // Allocation successful, bump live data stats: - if (!ShenandoahHeap::heap()->is_concurrent_traversal_in_progress()) { + if (implicit_live(type)) { r->increase_live_data_words(word_size); } increase_used(word_size * HeapWordSize); @@ -197,7 +197,7 @@ used_words = ShenandoahHeapRegion::region_size_words(); } - if (!sh->is_concurrent_traversal_in_progress()) { + if (implicit_live(ShenandoahHeap::_alloc_shared)) { r->increase_live_data_words(used_words); } r->set_top(r->bottom() + used_words); @@ -343,6 +343,25 @@ } } +bool ShenandoahFreeSet::implicit_live(ShenandoahHeap::AllocType type) const { + if (heap->shenandoahPolicy()->can_do_traversal_gc()) { + if (heap->is_concurrent_traversal_in_progress()) { + return false; + } + switch (type) { + case ShenandoahHeap::_alloc_tlab: + case ShenandoahHeap::_alloc_shared: + return false; + case ShenandoahHeap::_alloc_gclab: + case ShenandoahHeap::_alloc_shared_gc: + return true; + default: + ShouldNotReachHere(); + } + } + return true; +} + #ifdef ASSERT void ShenandoahFreeSet::assert_heaplock_owned_by_current_thread() const { ShenandoahHeap::heap()->assert_heaplock_owned_by_current_thread(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -60,6 +60,7 @@ size_t count() const { return _free_bitmap.count_one_bits(); } + bool implicit_live(ShenandoahHeap::AllocType type) const; public: ShenandoahFreeSet(ShenandoahHeapRegionSet* regions, size_t max_regions);