--- old/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2019-06-04 13:16:55.832651466 -0700 +++ new/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2019-06-04 13:16:55.584651474 -0700 @@ -2258,7 +2258,7 @@ } size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const { - return (_policy->young_list_target_length() - _survivor.length()) * HeapRegion::GrainBytes; + return (_policy->young_list_target_length() - survivor_regions_count()) * HeapRegion::GrainBytes; } size_t G1CollectedHeap::tlab_used(Thread* ignored) const { @@ -2489,7 +2489,7 @@ G1HeapSummary G1CollectedHeap::create_g1_heap_summary() { size_t eden_used_bytes = _eden.used_bytes(); - size_t survivor_used_bytes = _survivor.used_bytes(); + size_t survivor_used_bytes = survivor_regions_used_bytes(); size_t heap_used = Heap_lock->owned_by_self() ? used() : used_unlocked(); size_t eden_capacity_bytes = @@ -2877,7 +2877,7 @@ void G1CollectedHeap::calculate_collection_set(G1EvacuationInfo& evacuation_info, double target_pause_time_ms) { - _collection_set.finalize_initial_collection_set(target_pause_time_ms, &_survivor); + _collection_set.finalize_initial_collection_set(target_pause_time_ms); evacuation_info.set_collectionset_regions(collection_set()->region_length() + collection_set()->optional_region_length()); @@ -4390,6 +4390,11 @@ _policy->set_region_eden(hr); } +void G1CollectedHeap::set_retained_region_short_lived_locked(HeapRegion* hr) { + _eden.add(hr); + _policy->set_region_eden_from_survivor(hr); +} + #ifdef ASSERT class NoYoungRegionsClosure: public HeapRegionClosure { @@ -4546,6 +4551,22 @@ } // Methods for the mutator alloc region +void G1CollectedHeap::update_as_mutator_region(HeapRegion* alloc_region, bool is_reused) { + const char* msg; + + if (is_reused) { + set_retained_region_short_lived_locked(alloc_region); + _hr_printer.reuse(alloc_region); + msg = "Mutator Region Allocation (Reuse)"; + } else { + set_region_short_lived_locked(alloc_region); + _hr_printer.alloc(alloc_region, !policy()->should_allocate_mutator_region()); + msg = "Mutator Region Allocation"; + } + + _verifier->check_bitmaps(msg, alloc_region); + _policy->remset_tracker()->update_at_allocate(alloc_region); +} HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size, bool force) { @@ -4556,10 +4577,7 @@ HeapRegionType::Eden, false /* do_expand */); if (new_alloc_region != NULL) { - set_region_short_lived_locked(new_alloc_region); - _hr_printer.alloc(new_alloc_region, !should_allocate); - _verifier->check_bitmaps("Mutator Region Allocation", new_alloc_region); - _policy->remset_tracker()->update_at_allocate(new_alloc_region); + update_as_mutator_region(new_alloc_region, false); return new_alloc_region; } } @@ -4573,7 +4591,7 @@ collection_set()->add_eden_region(alloc_region); increase_used(allocated_bytes); - _eden.add_used_bytes(allocated_bytes); + _eden.add_used_bytes(alloc_region, allocated_bytes); _hr_printer.retire(alloc_region); // We update the eden sizes here, when the region is retired, @@ -4582,6 +4600,10 @@ g1mm()->update_eden_size(); } +void G1CollectedHeap::reuse_retained_survivor_region(HeapRegion* alloc_region) { + update_as_mutator_region(alloc_region, true); +} + // Methods for the GC alloc regions bool G1CollectedHeap::has_more_regions(G1HeapRegionAttr dest) { @@ -4640,11 +4662,17 @@ bool const during_im = collector_state()->in_initial_mark_gc(); if (during_im && allocated_bytes > 0) { - _cm->root_regions()->add(alloc_region); + _cm->root_regions()->add(alloc_region->next_top_at_mark_start(), alloc_region->top()); } _hr_printer.retire(alloc_region); } +void G1CollectedHeap::update_retained_survivor_gc_alloc_region(HeapRegion* alloc_region) { + _survivor.remove(alloc_region); + // To reuse the given region, setting EdenTag is also necessary but it will be done when + // the region is initialized as a mutator region. +} + HeapRegion* G1CollectedHeap::alloc_highest_free_region() { bool expanded = false; uint index = _hrm->find_highest_free(&expanded); @@ -4771,3 +4799,23 @@ GrowableArray G1CollectedHeap::memory_pools() { return _g1mm->memory_pools(); } + +uint G1CollectedHeap::eden_regions_count() const { + assert(_eden.length() >= _survivor.retained_length(), "Eden length (%u) should be " + "larger than or equal to retained region (%u).", + _eden.length(), _survivor.retained_length()); + return _eden.length() - _survivor.retained_length(); +} + +uint G1CollectedHeap::survivor_regions_count() const { + return _survivor.length() + _survivor.retained_length(); +} + +size_t G1CollectedHeap::eden_regions_used_bytes() const { + return _eden.used_bytes(); +} + +size_t G1CollectedHeap::survivor_regions_used_bytes() const { + return _survivor.used_bytes() + _survivor.retained_used_bytes(); +} +