--- old/src/hotspot/share/gc/g1/g1RemSet.cpp 2019-11-19 11:06:12.158983095 +0100 +++ new/src/hotspot/share/gc/g1/g1RemSet.cpp 2019-11-19 11:06:11.718980913 +0100 @@ -196,30 +196,6 @@ } }; - // Creates a snapshot of the current _top values at the start of collection to - // filter out card marks that we do not want to scan. - class G1ResetScanTopClosure : public HeapRegionClosure { - G1RemSetScanState* _scan_state; - - public: - G1ResetScanTopClosure(G1RemSetScanState* scan_state) : _scan_state(scan_state) { } - - virtual bool do_heap_region(HeapRegion* r) { - uint hrm_index = r->hrm_index(); - if (r->in_collection_set()) { - // Young regions had their card table marked as young at their allocation; - // we need to make sure that these marks are cleared at the end of GC, *but* - // they should not be scanned for cards. - // So directly add them to the "all_dirty_regions". - // Same for regions in the (initial) collection set: they may contain cards from - // the log buffers, make sure they are cleaned. - _scan_state->add_all_dirty_region(hrm_index); - } else if (r->is_old_or_humongous_or_archive()) { - _scan_state->set_scan_top(hrm_index, r->top()); - } - return false; - } - }; // For each region, contains the maximum top() value to be used during this garbage // collection. Subsumes common checks like filtering out everything but old and // humongous regions outside the collection set. @@ -328,16 +304,8 @@ } void prepare() { - for (size_t i = 0; i < _max_regions; i++) { - _collection_set_iter_state[i] = false; - clear_scan_top((uint)i); - } - _all_dirty_regions = new G1DirtyRegions(_max_regions); _next_dirty_regions = new G1DirtyRegions(_max_regions); - - G1ResetScanTopClosure cl(this); - G1CollectedHeap::heap()->heap_region_iterate(&cl); } void prepare_for_merge_heap_roots() { @@ -430,6 +398,10 @@ } while (cur != start_pos); } + void reset_region_claim(uint region_idx) { + _collection_set_iter_state[region_idx] = false; + } + // Attempt to claim the given region in the collection set for iteration. Returns true // if this call caused the transition from Unclaimed to Claimed. inline bool claim_collection_set_region(uint region) { @@ -909,6 +881,26 @@ } } +void G1RemSet::prepare_region_for_scan(HeapRegion* region) { + uint hrm_index = region->hrm_index(); + + _scan_state->reset_region_claim(hrm_index); + if (region->in_collection_set()) { + // Young regions had their card table marked as young at their allocation; + // we need to make sure that these marks are cleared at the end of GC, *but* + // they should not be scanned for cards. + // So directly add them to the "all_dirty_regions". + // Same for regions in the (initial) collection set: they may contain cards from + // the log buffers, make sure they are cleaned. + _scan_state->clear_scan_top(hrm_index); + _scan_state->add_all_dirty_region(hrm_index); + } else if (region->is_old_or_humongous_or_archive()) { + _scan_state->set_scan_top(hrm_index, region->top()); + } else { + assert(region->is_free(), "Should only be free region at this point %s", region->get_type_str()); + } +} + void G1RemSet::prepare_for_scan_heap_roots() { G1DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set(); dcqs.concatenate_logs(); @@ -1236,7 +1228,7 @@ } } -void G1RemSet::prepare_for_scan_heap_roots(uint region_idx) { +void G1RemSet::exclude_region_from_scan(uint region_idx) { _scan_state->clear_scan_top(region_idx); }