< 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,459 **** 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_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; public: G1RefineCardClosure(G1CollectedHeap* g1h, G1ScanObjsDuringUpdateRSClosure* update_rs_cl) : ! _g1rs(g1h->g1_rem_set()), _update_rs_cl(update_rs_cl) {} 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); return true; } }; 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); --- 428,471 ---- 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::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), _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"); ! 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,473 **** --- 476,489 ---- 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,694 **** } else { _num_conc_refined_cards++; // Unsynchronized update, only used for logging. } } ! void 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; } // 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(); --- 691,710 ---- } else { _num_conc_refined_cards++; // Unsynchronized update, only used for logging. } } ! 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 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,709 **** 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; } // 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; --- 715,725 ---- 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 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,720 **** --- 727,737 ---- 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 >