src/share/vm/gc_implementation/g1/concurrentMark.cpp

Print this page
rev 4120 : 8007772: G1: assert(!hr->isHumongous() || mr.start() == hr->bottom()) failed: the start of HeapRegion and MemRegion should be consistent for humongous regions
Summary: In do_marking_step(), we should always give up current region after scanning the object, if the region is humongous.
Reviewed-by:

*** 4060,4090 **** MemRegion mr = MemRegion(_finger, _region_limit); if (_cm->verbose_low()) { gclog_or_tty->print_cr("[%u] we're scanning part " "["PTR_FORMAT", "PTR_FORMAT") " ! "of region "PTR_FORMAT, ! _worker_id, _finger, _region_limit, _curr_region); } ! HeapRegion* hr = _g1h->heap_region_containing(mr.start()); ! assert(!hr->isHumongous() || mr.start() == hr->bottom(), ! "the start of HeapRegion and MemRegion should be consistent for humongous regions"); ! ! // The special case of the bitmap of a humongous region with its first ! // bit NOT marked should be avoided from (wasteful) iterating. ! // Note that the alternative case of the bitmap of a humongous region ! // with its first bit marked is handled properly in the iterate() routine. ! // Then, let's iterate over the bitmap of the part of the region that is ! // left. // If the iteration is successful, give up the region. ! // Also note that the case of the bitmap of a humongous region with its ! // first bit NOT marked is considered "successful", leveraging the fact ! // that the entire bitmap consists of all 0's in such case. ! if (mr.is_empty() || ! (hr != NULL && hr->isHumongous() && !_nextMarkBitMap->isMarked(mr.start())) || ! _nextMarkBitMap->iterate(&bitmap_closure, mr)) { giveup_current_region(); regular_clock_call(); } else { assert(has_aborted(), "currently the only way to do so"); // The only way to abort the bitmap iteration is to return --- 4060,4099 ---- MemRegion mr = MemRegion(_finger, _region_limit); if (_cm->verbose_low()) { gclog_or_tty->print_cr("[%u] we're scanning part " "["PTR_FORMAT", "PTR_FORMAT") " ! "of region "HR_FORMAT, ! _worker_id, _finger, _region_limit, ! HR_FORMAT_PARAMS(_curr_region)); } ! assert(!_curr_region->isHumongous() || mr.start() == _curr_region->bottom(), ! "humongous regions should go around loop once only"); ! ! // Some special cases: ! // If the memory region is empty, we can just give up the region. ! // If the current region is humongous then we only need to check ! // the bitmap for the bit associated with the start of the object, ! // scan the object if it's live, and give up the region. ! // Otherwise, let's iterate over the bitmap of the part of the region ! // that is left. // If the iteration is successful, give up the region. ! if (mr.is_empty()) { ! giveup_current_region(); ! regular_clock_call(); ! } else if (_curr_region->isHumongous() && mr.start() == _curr_region->bottom()) { ! if (_nextMarkBitMap->isMarked(mr.start())) { ! // The object is marked - apply the closure ! BitMap::idx_t offset = _nextMarkBitMap->heapWordToOffset(mr.start()); ! bitmap_closure.do_bit(offset); ! } ! // Even if this task aborted while scanning the humongous object ! // we can (and should) give up the current region. ! giveup_current_region(); ! regular_clock_call(); ! } else if (_nextMarkBitMap->iterate(&bitmap_closure, mr)) { giveup_current_region(); regular_clock_call(); } else { assert(has_aborted(), "currently the only way to do so"); // The only way to abort the bitmap iteration is to return