changeset 9609:357943ab942a

Reset mark bitmap concurrently with Java threads and using all concurrent GC threads.
author rkennke
date Mon, 07 Sep 2015 23:43:31 +0200
parents 8ab33a6942a6
children 5e256d10f5e3
files src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp src/share/vm/gc/shenandoah/shenandoahHeap.cpp src/share/vm/gc/shenandoah/shenandoahHeap.hpp src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp
diffstat 5 files changed, 27 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp	Mon Sep 07 17:24:25 2015 +0200
+++ b/src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp	Mon Sep 07 23:43:31 2015 +0200
@@ -101,6 +101,9 @@
 	  if (heap->is_evacuation_in_progress()) {
 	    heap->set_evacuation_in_progress(false);
 	  }
+	  heap->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps);
+	  heap->reset_mark_bitmap();
+	  heap->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps);
 	}
 
       } else {
--- a/src/share/vm/gc/shenandoah/shenandoahHeap.cpp	Mon Sep 07 17:24:25 2015 +0200
+++ b/src/share/vm/gc/shenandoah/shenandoahHeap.cpp	Mon Sep 07 23:43:31 2015 +0200
@@ -225,8 +225,31 @@
   }
 }
 
+class ResetBitmapTask : public AbstractGangTask {
+private:
+  ShenandoahHeapRegionSet* _regions;
+
+public:
+  ResetBitmapTask(ShenandoahHeapRegionSet* regions) :
+    AbstractGangTask("Parallel Reset Bitmap Task"), 
+    _regions(regions) {
+  }
+
+  void work(uint worker_id) {
+    ShenandoahHeapRegion* region = _regions->claim_next();
+    ShenandoahHeap* heap = ShenandoahHeap::heap();
+    while (region != NULL) {
+      heap->reset_mark_bitmap_range(region->bottom(), region->end());
+      region = _regions->claim_next();
+    }
+  }
+};
+
 void ShenandoahHeap::reset_mark_bitmap() {
-  _next_mark_bit_map->clearAll();
+  ShenandoahHeapRegionSet regions = ShenandoahHeapRegionSet(_num_regions, _ordered_regions, _num_regions);
+  ResetBitmapTask task = ResetBitmapTask(&regions);
+  conc_workers()->set_active_workers(_max_conc_workers);
+  conc_workers()->run_task(&task);
 }
 
 void ShenandoahHeap::reset_mark_bitmap_range(HeapWord* from, HeapWord* to) {
@@ -1371,7 +1394,6 @@
 
     // Update-references completed, no need to update-refs during marking.
     set_need_update_refs(false);
-    set_need_reset_bitmaps(false);
   }
 
   Universe::update_heap_info_at_gc();
@@ -2827,14 +2849,6 @@
   _need_update_refs = need_update_refs;
 }
 
-void ShenandoahHeap::set_need_reset_bitmaps(bool need_reset_bitmaps) {
-  _need_reset_bitmaps = need_reset_bitmaps;
-}
-
-bool ShenandoahHeap::need_reset_bitmaps() const {
-  return _need_reset_bitmaps;
-}
-
 ShenandoahJNICritical* ShenandoahHeap::jni_critical() {
   return _jni_critical;
 }
--- a/src/share/vm/gc/shenandoah/shenandoahHeap.hpp	Mon Sep 07 17:24:25 2015 +0200
+++ b/src/share/vm/gc/shenandoah/shenandoahHeap.hpp	Mon Sep 07 23:43:31 2015 +0200
@@ -333,9 +333,6 @@
   inline bool need_update_refs() const;
   void set_need_update_refs(bool update_refs);
 
-  bool need_reset_bitmaps() const;
-  void set_need_reset_bitmaps(bool need_reset_bitmaps);
-
   ReferenceProcessor* ref_processor() { return _ref_processor;}	
   virtual void ref_processing_init();
   ShenandoahIsAliveClosure isAlive;
--- a/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp	Mon Sep 07 17:24:25 2015 +0200
+++ b/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp	Mon Sep 07 23:43:31 2015 +0200
@@ -33,9 +33,6 @@
   assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
   IsGCActiveMark is_active;
 
-  // if concgc gets cancelled between phases the bitmap doesn't get cleared up.
-  _heap->reset_mark_bitmap();
- 
   assert(Thread::current()->is_VM_thread(), "Do full GC only while world is stopped");
   assert(_heap->is_bitmap_clear(), "require cleared bitmap");
   assert(!_heap->concurrent_mark_in_progress(), "can't do full-GC while marking is in progress");
--- a/src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp	Mon Sep 07 17:24:25 2015 +0200
+++ b/src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp	Mon Sep 07 23:43:31 2015 +0200
@@ -18,16 +18,8 @@
   ShenandoahHeap *sh = (ShenandoahHeap*) Universe::heap();
   sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::init_mark);
 
-  if (sh->need_reset_bitmaps()) {
-    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps);
-    sh->reset_mark_bitmap();
-    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps);
-  }
-
   assert(sh->is_bitmap_clear(), "need clear marking bitmap");
 
-  sh->set_need_reset_bitmaps(true);
-
   if (ShenandoahGCVerbose)
     tty->print("vm_ShenandoahInitMark\n");
   sh->start_concurrent_marking();