< 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 >