< prev index next >

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

Print this page
rev 56992 : imported patch 8227739-merge-scan-rs-update-rs-cost

*** 925,934 **** --- 925,936 ---- uint _merged_sparse; uint _merged_fine; uint _merged_coarse; + size_t _cards_dirty; + // Returns if the region contains cards we need to scan. If so, remember that // region in the current set of dirty regions. bool remember_if_interesting(uint const region_idx) { if (!_scan_state->contains_cards_to_process(region_idx)) { return false;
*** 940,960 **** G1MergeCardSetClosure(G1RemSetScanState* scan_state) : _scan_state(scan_state), _ct(G1CollectedHeap::heap()->card_table()), _merged_sparse(0), _merged_fine(0), ! _merged_coarse(0) { } void next_coarse_prt(uint const region_idx) { if (!remember_if_interesting(region_idx)) { return; } _merged_coarse++; size_t region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; ! _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion); _scan_state->set_chunk_region_dirty(region_base_idx); } void next_fine_prt(uint const region_idx, BitMap* bm) { if (!remember_if_interesting(region_idx)) { --- 942,963 ---- G1MergeCardSetClosure(G1RemSetScanState* scan_state) : _scan_state(scan_state), _ct(G1CollectedHeap::heap()->card_table()), _merged_sparse(0), _merged_fine(0), ! _merged_coarse(0), ! _cards_dirty(0) { } void next_coarse_prt(uint const region_idx) { if (!remember_if_interesting(region_idx)) { return; } _merged_coarse++; size_t region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; ! _cards_dirty += _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion); _scan_state->set_chunk_region_dirty(region_base_idx); } void next_fine_prt(uint const region_idx, BitMap* bm) { if (!remember_if_interesting(region_idx)) {
*** 964,974 **** _merged_fine++; size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; BitMap::idx_t cur = bm->get_next_one_offset(0); while (cur != bm->size()) { ! _ct->mark_clean_as_dirty(region_base_idx + cur); _scan_state->set_chunk_dirty(region_base_idx + cur); cur = bm->get_next_one_offset(cur + 1); } } --- 967,977 ---- _merged_fine++; size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; BitMap::idx_t cur = bm->get_next_one_offset(0); while (cur != bm->size()) { ! _cards_dirty += _ct->mark_clean_as_dirty(region_base_idx + cur); _scan_state->set_chunk_dirty(region_base_idx + cur); cur = bm->get_next_one_offset(cur + 1); } }
*** 980,990 **** _merged_sparse++; size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; for (uint i = 0; i < num_cards; i++) { size_t card_idx = region_base_idx + cards[i]; ! _ct->mark_clean_as_dirty(card_idx); _scan_state->set_chunk_dirty(card_idx); } } virtual bool do_heap_region(HeapRegion* r) { --- 983,993 ---- _merged_sparse++; size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; for (uint i = 0; i < num_cards; i++) { size_t card_idx = region_base_idx + cards[i]; ! _cards_dirty += _ct->mark_clean_as_dirty(card_idx); _scan_state->set_chunk_dirty(card_idx); } } virtual bool do_heap_region(HeapRegion* r) {
*** 999,1008 **** --- 1002,1013 ---- } size_t merged_sparse() const { return _merged_sparse; } size_t merged_fine() const { return _merged_fine; } size_t merged_coarse() const { return _merged_coarse; } + + size_t cards_dirty() const { return _cards_dirty; } }; // Visitor for the remembered sets of humongous candidate regions to merge their // remembered set into the card table. class G1FlushHumongousCandidateRemSets : public HeapRegionClosure {
*** 1044,1053 **** --- 1049,1060 ---- } size_t merged_sparse() const { return _cl.merged_sparse(); } size_t merged_fine() const { return _cl.merged_fine(); } size_t merged_coarse() const { return _cl.merged_coarse(); } + + size_t cards_dirty() const { return _cl.cards_dirty(); } }; // Visitor for the log buffer entries to merge them into the card table. class G1MergeLogBufferCardsClosure : public G1CardTableEntryClosure { G1RemSetScanState* _scan_state;
*** 1145,1154 **** --- 1152,1162 ---- g1h->heap_region_iterate(&cl); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse); + p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.cards_dirty(), G1GCPhaseTimes::MergeRSDirtyCards); } // Merge remembered sets of current candidates. { G1GCParPhaseTimesTracker x(p, merge_remset_phase, worker_id, _initial_evacuation /* must_record */);
*** 1156,1165 **** --- 1164,1174 ---- g1h->collection_set_iterate_increment_from(&cl, &_hr_claimer, worker_id); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine); p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse); + p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.cards_dirty(), G1GCPhaseTimes::MergeRSDirtyCards); } // Apply closure to log entries in the HCC. if (_initial_evacuation && G1HotCardCache::default_use_cache()) { assert(merge_remset_phase == G1GCPhaseTimes::MergeRS, "Wrong merge phase");
< prev index next >