void CardTableRS::younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl) { const MemRegion urasm = sp->used_region_at_save_marks(); #ifdef ASSERT // Convert the assertion check to a warning if we are running // CMS+ParNew until related bug is fixed. MemRegion ur = sp->used_region(); assert(ur.contains(urasm) || (UseConcMarkSweepGC && UseParNewGC), err_msg("Did you forget to call save_marks()? " "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " "[" PTR_FORMAT ", " PTR_FORMAT ")", urasm.start(), urasm.end(), ur.start(), ur.end())); // In the case of CMS+ParNew, issue a warning if (!ur.contains(urasm)) { assert(UseConcMarkSweepGC && UseParNewGC, "Tautology: see assert above"); warning("CMS+ParNew: Did you forget to call save_marks()? " "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " "[" PTR_FORMAT ", " PTR_FORMAT ")", urasm.start(), urasm.end(), ur.start(), ur.end()); MemRegion ur2 = sp->used_region(); MemRegion urasm2 = sp->used_region_at_save_marks(); if (!ur.equals(ur2)) { warning("CMS+ParNew: Flickering used_region()!!"); } if (!urasm.equals(urasm2)) { warning("CMS+ParNew: Flickering used_region_at_save_marks()!!"); } ShouldNotReachHere(); } #endif _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm, cl, this); }
void ContiguousSpace::oop_iterate(MemRegion mr, OopClosure* blk) { if (is_empty()) { return; } MemRegion cur = MemRegion(bottom(), top()); mr = mr.intersection(cur); if (mr.is_empty()) { return; } if (mr.equals(cur)) { oop_iterate(blk); return; } assert(mr.end() <= top(), "just took an intersection above"); HeapWord* obj_addr = block_start(mr.start()); HeapWord* t = mr.end(); // Handle first object specially. oop obj = oop(obj_addr); SpaceMemRegionOopsIterClosure smr_blk(blk, mr); obj_addr += obj->oop_iterate(&smr_blk); while (obj_addr < t) { oop obj = oop(obj_addr); assert(obj->is_oop(), "expected an oop"); obj_addr += obj->size(); // If "obj_addr" is not greater than top, then the // entire object "obj" is within the region. if (obj_addr <= t) { obj->oop_iterate(blk); } else { // "obj" extends beyond end of region obj->oop_iterate(&smr_blk); break; } }; }