< prev index next >
src/hotspot/share/gc/g1/g1RemSet.cpp
Print this page
@@ -194,34 +194,10 @@
}
}
}
};
- // 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.
@@ -326,20 +302,12 @@
_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);
-
- G1ResetScanTopClosure cl(this);
- G1CollectedHeap::heap()->heap_region_iterate(&cl);
}
void prepare_for_merge_heap_roots() {
_all_dirty_regions->merge(_next_dirty_regions);
@@ -428,10 +396,14 @@
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]) {
@@ -907,10 +879,30 @@
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 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();
_scan_state->prepare();
@@ -1234,11 +1226,11 @@
if (log_is_enabled(Debug, gc, remset)) {
print_merge_heap_roots_stats();
}
}
-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);
}
void G1RemSet::cleanup_after_scan_heap_roots() {
G1GCPhaseTimes* phase_times = _g1h->phase_times();
< prev index next >