< prev index next >

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

Print this page
rev 13130 : Interleave partial GCs with concurrent GCs.

@@ -104,11 +104,11 @@
     // Step 2: Process all root regions.
     {
       ShenandoahHeapRegion* r = _root_regions->claim_next();
       while (r != NULL) {
         assert(r->is_root(), "must be root region");
-        r->oop_iterate(&cl);
+        _heap->marked_object_oop_iterate(r, &cl);
         r->set_root(false);
         if (check_and_handle_cancelled_gc()) return;
         r = _root_regions->claim_next();
       }
     }

@@ -297,10 +297,15 @@
       ShenandoahHeap::ShenandoahHeapLock heap_lock(_heap);
       size_t num_cset = _heap->collection_set()->count();
       for (size_t i = 0; i < num_cset; i++) {
         ShenandoahHeapRegion* r = _heap->collection_set()->get(i);
         _heap->decrease_used(r->used());
+        HeapWord* bottom = r->bottom();
+        HeapWord* top = _heap->complete_top_at_mark_start(r->bottom());
+        if (top > bottom) {
+          _heap->complete_mark_bit_map()->clear_range_large(MemRegion(bottom, top));
+        }
         r->recycle();
         _heap->free_regions()->add_region(r);
       }
 
       reset();

@@ -341,11 +346,11 @@
       obj = forw; // For matrix update below.
     }
     if (UPDATE_MATRIX) {
 #ifdef ASSERT
       oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj);
-      assert(oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must not be evacuated");
+      assert(oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must not be evacuated: "PTR_FORMAT" -> "PTR_FORMAT, p2i(obj), p2i(forw));
 #endif
       _matrix->set_connected(p, obj);
     }
   }
 }
< prev index next >