< prev index next >
src/hotspot/share/gc/g1/g1RemSet.cpp
Print this page
rev 57124 : imported patch 8227739-merge-scan-rs-update-rs-cost
*** 926,935 ****
--- 926,937 ----
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;
*** 941,961 ****
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)) {
--- 943,964 ----
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)) {
*** 965,975 ****
_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);
}
}
--- 968,978 ----
_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);
}
}
*** 981,991 ****
_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) {
--- 984,994 ----
_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) {
*** 1000,1009 ****
--- 1003,1014 ----
}
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 {
*** 1045,1054 ****
--- 1050,1061 ----
}
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;
*** 1146,1155 ****
--- 1153,1163 ----
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 */);
*** 1157,1166 ****
--- 1165,1175 ----
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 >