--- old/src/hotspot/share/gc/g1/g1RemSet.cpp 2019-11-20 14:56:57.826667540 +0100 +++ new/src/hotspot/share/gc/g1/g1RemSet.cpp 2019-11-20 14:56:57.484656955 +0100 @@ -927,6 +927,8 @@ 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) { @@ -942,7 +944,8 @@ _ct(G1CollectedHeap::heap()->card_table()), _merged_sparse(0), _merged_fine(0), - _merged_coarse(0) { } + _merged_coarse(0), + _cards_dirty(0) { } void next_coarse_prt(uint const region_idx) { if (!remember_if_interesting(region_idx)) { @@ -952,7 +955,7 @@ _merged_coarse++; size_t region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion; - _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion); + _cards_dirty += _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion); _scan_state->set_chunk_region_dirty(region_base_idx); } @@ -966,7 +969,7 @@ 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); + _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); } @@ -982,7 +985,7 @@ 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); + _cards_dirty += _ct->mark_clean_as_dirty(card_idx); _scan_state->set_chunk_dirty(card_idx); } } @@ -1001,6 +1004,8 @@ 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 @@ -1046,6 +1051,8 @@ 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. @@ -1147,6 +1154,7 @@ 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. @@ -1158,6 +1166,7 @@ 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.