< prev index next >
src/share/vm/gc/g1/heapRegionRemSet.cpp
Print this page
rev 11045 : 8155233: Lazy coarse map clear
Summary: Only clear the coarse bitmaps of the remembered sets if they were dirtied.
Reviewed-by:
@@ -263,11 +263,12 @@
false /* in-resource-area */),
_fine_grain_regions(NULL),
_first_all_fine_prts(NULL), _last_all_fine_prts(NULL),
_n_fine_entries(0), _n_coarse_entries(0),
_fine_eviction_start(0),
- _sparse_table(hr)
+ _sparse_table(hr),
+ _coarse_dirty(false)
{
typedef PerRegionTable* PerRegionTablePtr;
if (_max_fine_entries == 0) {
assert(_mod_max_fine_entries_mask == 0, "Both or none.");
@@ -502,10 +503,11 @@
// Set the corresponding coarse bit.
size_t max_hrm_index = (size_t) max->hr()->hrm_index();
if (!_coarse_map.at(max_hrm_index)) {
_coarse_map.at_put(max_hrm_index, true);
+ _coarse_dirty = true;
_n_coarse_entries++;
}
// Unsplice.
*max_prev = max->collision_list_next();
@@ -519,10 +521,11 @@
log_develop_trace(gc, remset, scrub)("Scrubbing region %u:", _hr->hrm_index());
log_develop_trace(gc, remset, scrub)(" Coarse map: before = " SIZE_FORMAT "...", _n_coarse_entries);
live_data->remove_nonlive_regions(&_coarse_map);
_n_coarse_entries = _coarse_map.count_one_bits();
+ _coarse_dirty = _n_coarse_entries != 0;
log_develop_trace(gc, remset, scrub)(" after = " SIZE_FORMAT ".", _n_coarse_entries);
// Now do the fine-grained maps.
for (size_t i = 0; i < _max_fine_entries; i++) {
PerRegionTable* cur = _fine_grain_regions[i];
@@ -644,11 +647,14 @@
guarantee(_first_all_fine_prts == NULL && _last_all_fine_prts == NULL, "just checking");
}
_first_all_fine_prts = _last_all_fine_prts = NULL;
_sparse_table.clear();
+ if (_coarse_dirty) {
_coarse_map.clear();
+ _coarse_dirty = false;
+ }
_n_fine_entries = 0;
_n_coarse_entries = 0;
clear_fcc();
}
< prev index next >