8155233: Lazy coarse map clear
authortschatzl
Mon, 02 May 2016 10:24:41 +0200
changeset 38156 e0ff734fa7de
parent 38155 a4501a2965dc
child 38157 49d65a3ea6b6
8155233: Lazy coarse map clear Summary: Only clear the coarse bitmaps of the remembered sets if they were dirtied. Reviewed-by: jmasa, mgerdin
hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp
hotspot/src/share/vm/gc/g1/heapRegionRemSet.hpp
--- a/hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp	Mon May 02 10:24:41 2016 +0200
+++ b/hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp	Mon May 02 10:24:41 2016 +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++;
   }
 
@@ -519,8 +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();
+  if (_coarse_dirty) {
+    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 +651,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;
 
--- a/hotspot/src/share/vm/gc/g1/heapRegionRemSet.hpp	Mon May 02 10:24:41 2016 +0200
+++ b/hotspot/src/share/vm/gc/g1/heapRegionRemSet.hpp	Mon May 02 10:24:41 2016 +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;