--- old/src/share/vm/gc/g1/heapRegionRemSet.cpp 2016-04-28 22:33:44.260071704 +0200 +++ new/src/share/vm/gc/g1/heapRegionRemSet.cpp 2016-04-28 22:33:44.153068454 +0200 @@ -265,7 +265,8 @@ _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; @@ -504,6 +505,7 @@ 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++; } @@ -521,6 +523,7 @@ 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. @@ -646,7 +649,10 @@ _first_all_fine_prts = _last_all_fine_prts = NULL; _sparse_table.clear(); - _coarse_map.clear(); + if (_coarse_dirty) { + _coarse_map.clear(); + _coarse_dirty = false; + } _n_fine_entries = 0; _n_coarse_entries = 0; --- old/src/share/vm/gc/g1/heapRegionRemSet.hpp 2016-04-28 22:33:44.821088744 +0200 +++ new/src/share/vm/gc/g1/heapRegionRemSet.hpp 2016-04-28 22:33:44.717085585 +0200 @@ -79,6 +79,7 @@ HeapRegion* _hr; // These are protected by "_m". + bool _coarse_dirty; BitMap _coarse_map; size_t _n_coarse_entries; static jint _n_coarsenings;