< prev index next >

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

Print this page

        

*** 302,316 **** _scan_chunks_shift = (uint8_t)log2_intptr(HeapRegion::CardsPerRegion / _scan_chunks_per_region); _scan_top = NEW_C_HEAP_ARRAY(HeapWord*, max_regions, mtGC); } 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); } void prepare_for_merge_heap_roots() { --- 302,311 ----
*** 401,410 **** --- 396,409 ---- cur = 0; } } 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) { assert(region < _max_regions, "Tried to access invalid region %u", region); if (_collection_set_iter_state[region]) {
*** 880,902 **** 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() { --- 879,903 ---- 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); } } ! 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 { ! assert(region->is_old_or_humongous_or_archive(), "All other regions should be in the collection set"); _scan_state->set_scan_top(hrm_index, region->top()); } } void G1RemSet::prepare_for_scan_heap_roots() {
< prev index next >