changeset 7463:7c17c9b67762

Reset mark bitmaps piggy-backed on reference-updating.
author Roman Kennke <rkennke@redhat.com>
date Wed, 11 Feb 2015 23:42:58 +0100
parents c0734957b505
children cc302a9b1bdc
files src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp
diffstat 4 files changed, 29 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp	Wed Feb 11 23:42:55 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp	Wed Feb 11 23:42:58 2015 +0100
@@ -487,7 +487,9 @@
   print_summary_sd("Final Update Refs Pauses", &(_timing_data[final_uprefs]._ms));
   print_summary_sd("  Update roots", &(_timing_data[update_roots]._ms));
   print_summary_sd("  Recycle regions", &(_timing_data[recycle_regions]._ms));
-  print_summary_sd("  Reset bitmaps", &(_timing_data[reset_bitmaps]._ms));
+  if (! ShenandoahUpdateRefsEarly) {
+    print_summary_sd("  Reset bitmaps", &(_timing_data[reset_bitmaps]._ms));
+  }
   print_summary_sd("  Resize TLABs", &(_timing_data[resize_tlabs]._ms));
   gclog_or_tty->print_cr(" ");
   print_summary_sd("Concurrent Marking Times", &(_timing_data[conc_mark]._ms));
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Wed Feb 11 23:42:55 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Wed Feb 11 23:42:58 2015 +0100
@@ -145,23 +145,14 @@
   size_t bitmap_size = CMBitMap::compute_size(heap_rs.size());
   MemRegion heap_region = MemRegion((HeapWord*) heap_rs.base(), heap_rs.size() / HeapWordSize);
 
-  ReservedSpace bitmap_0(ReservedSpace::allocation_align_size_up(bitmap_size));
-  os::commit_memory_or_exit(bitmap_0.base(), bitmap_0.size(), false, err_msg("couldn't allocate mark bitmap 0"));
-
-  MemRegion bitmap_0_region = MemRegion((HeapWord*) bitmap_0.base(), bitmap_0.size() / HeapWordSize);
-  _mark_bit_map0.initialize(heap_region, bitmap_0_region);
-
-  ReservedSpace bitmap_1(ReservedSpace::allocation_align_size_up(bitmap_size));
-  os::commit_memory_or_exit(bitmap_1.base(), bitmap_1.size(), false, err_msg("couldn't allocate mark bitmap 1"));
-  MemRegion bitmap_1_region = MemRegion((HeapWord*) bitmap_1.base(), bitmap_1.size() / HeapWordSize);
-  _mark_bit_map1.initialize(heap_region, bitmap_1_region);
-
-  _prev_mark_bit_map = &_mark_bit_map0;
-  _next_mark_bit_map = &_mark_bit_map1;
+  ReservedSpace bitmap(ReservedSpace::allocation_align_size_up(bitmap_size));
+  os::commit_memory_or_exit(bitmap.base(), bitmap.size(), false, err_msg("couldn't allocate mark bitmap"));
+  MemRegion bitmap_region = MemRegion((HeapWord*) bitmap.base(), bitmap.size() / HeapWordSize);
+  _mark_bit_map.initialize(heap_region, bitmap_region);
+
+  _next_mark_bit_map = &_mark_bit_map;
   reset_mark_bitmap();
 
-  // TODO: Implement swapping of mark bitmaps.
-
   // Initialize fast collection set test structure.
   _in_cset_fast_test_length = _max_regions;
   _in_cset_fast_test_base =
@@ -193,8 +184,7 @@
   _in_cset_fast_test(NULL),
   _in_cset_fast_test_base(NULL),
   _tracer(new (ResourceObj::C_HEAP, mtGC) ShenandoahTracer()),
-  _mark_bit_map0(),
-  _mark_bit_map1(),
+  _mark_bit_map(),
   _cancelled_evacuation(false) {
   _pgc = this;
   _scm = new ShenandoahConcurrentMark();
@@ -203,12 +193,13 @@
 }
 
 void ShenandoahHeap::reset_mark_bitmap() {
-  CMBitMap* current = _next_mark_bit_map;
-  _next_mark_bit_map = _prev_mark_bit_map;
-  _prev_mark_bit_map = current;
   _next_mark_bit_map->clearAll();
 }
 
+void ShenandoahHeap::reset_mark_bitmap_range(HeapWord* from, HeapWord* to) {
+  _next_mark_bit_map->clearRange(MemRegion(from, to));
+}
+
 class BitmapClearClosure : public BitMapClosure {
 private:
   CMBitMap* _bm;
@@ -1144,6 +1135,7 @@
         HeapWord* failed = region->object_iterate_careful(&update_refs_cl);
         assert(failed == NULL, "careful iteration is implemented safe for now in Shenandaoh");
       }
+      heap->reset_mark_bitmap_range(region->bottom(), region->end());
       region = _regions->claim_next();
     }
   }
@@ -2167,11 +2159,9 @@
     tty->print_cr("heap region containing obj:");
     ShenandoahHeapRegion* obj_region = heap_region_containing(obj);
     obj_region->print();
-    tty->print_cr("obj has been marked prev: %d", is_marked_prev(obj));
     tty->print_cr("heap region containing forwardee:");
     ShenandoahHeapRegion* forward_region = heap_region_containing(oopDesc::bs()->resolve_oop(obj));
     forward_region->print();    
-    tty->print_cr("fwd has been marked prev: %d", is_marked_prev(oopDesc::bs()->resolve_oop(obj)));
   }
 #endif
 
@@ -2187,10 +2177,6 @@
   return _next_mark_bit_map->isMarked((HeapWord*) obj);
 }
 
-bool ShenandoahHeap::is_marked_prev(oop obj) const {
-  return _prev_mark_bit_map->isMarked((HeapWord*) obj);
-}
-
 void ShenandoahHeap::verify_copy(oop p,oop c){
     assert(p != oopDesc::bs()->resolve_oop(p), "forwarded correctly");
     assert(oopDesc::bs()->resolve_oop(p) == c, "verify pointer is correct");
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp	Wed Feb 11 23:42:55 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp	Wed Feb 11 23:42:58 2015 +0100
@@ -83,12 +83,9 @@
   int _max_conc_workers;
   volatile size_t _used;
 
-  CMBitMap _mark_bit_map0;
+  CMBitMap _mark_bit_map;
   CMBitMap* _next_mark_bit_map;
 
-  CMBitMap _mark_bit_map1;
-  CMBitMap* _prev_mark_bit_map;
-
   bool* _in_cset_fast_test;
   bool* _in_cset_fast_test_base;
   uint _in_cset_fast_test_length;
@@ -234,6 +231,8 @@
   }
 
   void reset_mark_bitmap();
+  void reset_mark_bitmap_range(HeapWord* from, HeapWord* to);
+
   bool is_bitmap_clear();
 
   virtual void post_allocation_collector_specific_setup(HeapWord* obj);
--- a/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp	Wed Feb 11 23:42:55 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp	Wed Feb 11 23:42:58 2015 +0100
@@ -225,11 +225,17 @@
     sh->verify_regions_after_update_refs();
   }
 
-  sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps);
-
-  sh->reset_mark_bitmap();
-
-  sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps);
+  if (! ShenandoahUpdateRefsEarly) {
+    // TODO: Do this concurrently after evacuation.
+    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps);
+    sh->reset_mark_bitmap();
+    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps);
+  }
+#ifdef ASSERT
+ else {
+   assert(sh->is_bitmap_clear(), "need cleared bitmap here");
+ }
+#endif
 
   sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::resize_tlabs);