--- old/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp Fri Jun 28 13:57:43 2019 +++ new/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp Fri Jun 28 13:57:42 2019 @@ -692,6 +692,10 @@ return _cmsSpace->max_alloc_in_words() * HeapWordSize; } +size_t ConcurrentMarkSweepGeneration::used_stable() const { + return cmsSpace()->used_stable(); +} + size_t ConcurrentMarkSweepGeneration::max_available() const { return free() + _virtual_space.uncommitted_size(); } @@ -1523,6 +1527,8 @@ FreelistLocker z(this); MetaspaceGC::compute_new_size(); _cmsGen->compute_new_size_free_list(); + // recalculate CMS used space after CMS collection + _cmsGen->cmsSpace()->recalculate_used_stable(); } // A work method used by the foreground collector to do @@ -2051,6 +2057,7 @@ _capacity_at_prologue = capacity(); _used_at_prologue = used(); + _cmsSpace->recalculate_used_stable(); // We enable promotion tracking so that card-scanning can recognize // which objects have been promoted during this GC and skip them. @@ -2123,6 +2130,7 @@ _eden_chunk_index = 0; size_t cms_used = _cmsGen->cmsSpace()->used(); + _cmsGen->cmsSpace()->recalculate_used_stable(); // update performance counters - this uses a special version of // update_counters() that allows the utilization to be passed as a @@ -2816,6 +2824,8 @@ rp->enable_discovery(); _collectorState = Marking; } + + _cmsGen->cmsSpace()->recalculate_used_stable(); } void CMSCollector::checkpointRootsInitialWork() { @@ -4177,6 +4187,7 @@ MutexLocker y(bitMapLock(), Mutex::_no_safepoint_check_flag); checkpointRootsFinalWork(); + _cmsGen->cmsSpace()->recalculate_used_stable(); } verify_work_stacks_empty(); verify_overflow_empty(); @@ -5337,9 +5348,14 @@ // further below. { CMSTokenSyncWithLocks ts(true, _cmsGen->freelistLock()); + // Update heap occupancy information which is used as // input to soft ref clearing policy at the next gc. Universe::update_heap_info_at_gc(); + + // recalculate CMS used space after CMS collection + _cmsGen->cmsSpace()->recalculate_used_stable(); + _collectorState = Resizing; } } @@ -5428,6 +5444,7 @@ // Gather statistics on the young generation collection. collector()->stats().record_gc0_end(used()); } + _cmsSpace->recalculate_used_stable(); } void CMSCollector::sweepWork(ConcurrentMarkSweepGeneration* old_gen) {