< prev index next >

src/hotspot/share/gc/g1/g1RemSet.cpp

Print this page
rev 56956 : 8141637: Parallelize single threaded heap region iteration during Pre Evacuate Collection Set
Reviewed-by:

*** 194,227 **** } } } }; - // 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. // This is valid because we are not interested in scanning stray remembered set // entries from free or archive regions. --- 194,203 ----
*** 333,345 **** 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() { _all_dirty_regions->merge(_next_dirty_regions); --- 309,318 ----
*** 907,916 **** --- 880,906 ---- p->record_or_add_thread_work_item(scan_phase, worker_id, cl.opt_refs_scanned(), G1GCPhaseTimes::ScanHRScannedOptRefs); p->record_or_add_thread_work_item(scan_phase, worker_id, cl.opt_refs_memory_used(), G1GCPhaseTimes::ScanHRUsedMemory); } } + // 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. + void G1RemSet::prepare_region_for_scanning(HeapRegion* region) { + uint hrm_index = region->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->add_all_dirty_region(hrm_index); + } else if (region->is_old_or_humongous_or_archive()) { + _scan_state->set_scan_top(hrm_index, region->top()); + } + } + void G1RemSet::prepare_for_scan_heap_roots() { G1DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set(); dcqs.concatenate_logs(); _scan_state->prepare();
< prev index next >