< prev index next >
src/share/vm/gc/g1/g1RemSet.cpp
Print this page
rev 13237 : imported patch 8183226-periodic-rem-set-summary-accesses-uninitialized-stuff
rev 13238 : imported patch 8183226-eridk-sjohanss-review
rev 13239 : imported patch 8183226-eridk-review2
rev 13240 : imported patch 8183128-cleanup-refinecardtableentryclosure
rev 13241 : imported patch 8183128-erikd-review
rev 13242 : imported patch 8183539-remove-into-cset-dcqs
rev 13243 : [mq]: 8183121-add-information-about-scanned-skipped-cards-during-updaters
@@ -428,32 +428,44 @@
cl.strong_code_root_scan_time_sec();
G1GCPhaseTimes* p = _g1p->phase_times();
p->record_time_secs(G1GCPhaseTimes::ScanRS, worker_i, scan_rs_time_sec);
- p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_scanned(), G1GCPhaseTimes::ScannedCards);
- p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_claimed(), G1GCPhaseTimes::ClaimedCards);
- p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_skipped(), G1GCPhaseTimes::SkippedCards);
+ p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_scanned(), G1GCPhaseTimes::ScanRSScannedCards);
+ p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_claimed(), G1GCPhaseTimes::ScanRSClaimedCards);
+ p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_skipped(), G1GCPhaseTimes::ScanRSSkippedCards);
p->record_time_secs(G1GCPhaseTimes::CodeRoots, worker_i, cl.strong_code_root_scan_time_sec());
}
// Closure used for updating rem sets. Only called during an evacuation pause.
class G1RefineCardClosure: public CardTableEntryClosure {
G1RemSet* _g1rs;
G1ScanObjsDuringUpdateRSClosure* _update_rs_cl;
+
+ size_t _cards_scanned;
+ size_t _cards_skipped;
public:
G1RefineCardClosure(G1CollectedHeap* g1h, G1ScanObjsDuringUpdateRSClosure* update_rs_cl) :
- _g1rs(g1h->g1_rem_set()), _update_rs_cl(update_rs_cl)
+ _g1rs(g1h->g1_rem_set()), _update_rs_cl(update_rs_cl), _cards_scanned(0), _cards_skipped(0)
{}
bool do_card_ptr(jbyte* card_ptr, uint worker_i) {
assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
- _g1rs->refine_card_during_gc(card_ptr, _update_rs_cl);
+ bool card_scanned = _g1rs->refine_card_during_gc(card_ptr, _update_rs_cl);
+
+ if (card_scanned) {
+ _cards_scanned++;
+ } else {
+ _cards_skipped++;
+ }
return true;
}
+
+ size_t cards_scanned() const { return _cards_scanned; }
+ size_t cards_skipped() const { return _cards_skipped; }
};
void G1RemSet::update_rem_set(G1ParScanThreadState* pss, uint worker_i) {
G1ScanObjsDuringUpdateRSClosure update_rs_cl(_g1, pss, worker_i);
G1RefineCardClosure refine_card_cl(_g1, &update_rs_cl);
@@ -464,10 +476,14 @@
G1GCParPhaseTimesTracker y(_g1p->phase_times(), G1GCPhaseTimes::ScanHCC, worker_i);
_g1->iterate_hcc_closure(&refine_card_cl, worker_i);
}
// Apply the closure to all remaining log entries.
_g1->iterate_dirty_card_closure(&refine_card_cl, worker_i);
+
+ G1GCPhaseTimes* p = _g1p->phase_times();
+ p->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, refine_card_cl.cards_scanned(), G1GCPhaseTimes::UpdateRSScannedCards);
+ p->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, refine_card_cl.cards_skipped(), G1GCPhaseTimes::UpdateRSSkippedCards);
}
void G1RemSet::cleanupHRRS() {
HeapRegionRemSet::cleanup();
}
@@ -675,20 +691,20 @@
} else {
_num_conc_refined_cards++; // Unsynchronized update, only used for logging.
}
}
-void G1RemSet::refine_card_during_gc(jbyte* card_ptr,
+bool G1RemSet::refine_card_during_gc(jbyte* card_ptr,
G1ScanObjsDuringUpdateRSClosure* update_rs_cl) {
assert(_g1->is_gc_active(), "Only call during GC");
check_card_ptr(card_ptr, _ct_bs);
// If the card is no longer dirty, nothing to do. This covers cards that were already
// scanned as parts of the remembered sets.
if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
- return;
+ return false;
}
// During GC we can immediately clean the card since we will not re-enqueue stale
// cards as we know they can be disregarded.
*card_ptr = CardTableModRefBS::clean_card_val();
@@ -699,11 +715,11 @@
HeapRegion* r = _g1->heap_region_containing(card_start);
HeapWord* scan_limit = _scan_state->scan_top(r->hrm_index());
if (scan_limit <= card_start) {
// If the card starts above the area in the region containing objects to scan, skip it.
- return;
+ return false;
}
// Don't use addr_for(card_ptr + 1) which can ask for
// a card beyond the heap.
HeapWord* card_end = card_start + CardTableModRefBS::card_size_in_words;
@@ -711,10 +727,11 @@
assert(!dirty_region.is_empty(), "sanity");
update_rs_cl->set_region(r);
bool card_processed = r->oops_on_card_seq_iterate_careful<true>(dirty_region, update_rs_cl);
assert(card_processed, "must be");
+ return true;
}
void G1RemSet::print_periodic_summary_info(const char* header, uint period_count) {
if ((G1SummarizeRSetStatsPeriod > 0) && log_is_enabled(Trace, gc, remset) &&
(period_count % G1SummarizeRSetStatsPeriod == 0)) {
< prev index next >