< prev index next >

src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp

Print this page

        

@@ -279,10 +279,29 @@
   ShenandoahMCVerifyAfterMarkingRegionClosure cl;
   _heap->heap_region_iterate(&cl);
 #endif
 }
 
+class ShenandoahMCReclaimHumongousRegionClosure : public ShenandoahHeapRegionClosure {
+private:
+  ShenandoahHeap* _heap;
+public:
+  ShenandoahMCReclaimHumongousRegionClosure() : _heap(ShenandoahHeap::heap()) {
+  }
+
+  bool doHeapRegion(ShenandoahHeapRegion* r) {
+    if (r->is_humongous_start()) {
+      oop humongous_obj = oop(r->bottom() + BrooksPointer::word_size());
+      if (! _heap->is_marked_complete(humongous_obj)) {
+        _heap->reclaim_humongous_region_at(r);
+      }
+    }
+    return false;
+  }
+};
+
+
 class ShenandoahPrepareForCompactionObjectClosure : public ObjectClosure {
 
 private:
 
   ShenandoahHeap* _heap;

@@ -396,10 +415,13 @@
 
 void ShenandoahMarkCompact::phase2_calculate_target_addresses(ShenandoahHeapRegionSet** copy_queues) {
   GCTraceTime(Info, gc, phases) time("Phase 2: Compute new object addresses", _gc_timer);
   ShenandoahHeap* heap = ShenandoahHeap::heap();
 
+  ShenandoahMCReclaimHumongousRegionClosure cl;
+  heap->heap_region_iterate(&cl);
+
   // Initialize copy queues.
   for (uint i = 0; i < heap->max_parallel_workers(); i++) {
     copy_queues[i] = new ShenandoahHeapRegionSet(heap->max_regions());
   }
 

@@ -576,21 +598,11 @@
     // the complete marking bitmap is no longer valid. This ensures
     // size-based iteration in marked_object_iterate().
     _heap->set_complete_top_at_mark_start(r->bottom(), r->bottom());
     r->set_in_collection_set(false);
     if (r->is_humongous()) {
-      if (r->is_humongous_start()) {
-        oop humongous_obj = oop(r->bottom() + BrooksPointer::word_size());
-        if (! _heap->is_marked_complete(humongous_obj)) {
-          _heap->reclaim_humongous_region_at(r);
-        } else {
-          _live += ShenandoahHeapRegion::RegionSizeBytes;
-        }
-      } else {
         _live += ShenandoahHeapRegion::RegionSizeBytes;
-      }
-
     } else {
       size_t live = r->used();
       if (live == 0) {
         r->recycle();
         _heap->add_free_region(r);
< prev index next >