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

Print this page
rev 6927 : 8054808: Bitmap verification sometimes fails after Full GC aborts concurrent mark.
Summary: The verification code that checked whether no bitmap mark had been found re-read HeapRegion::end() after the check on the bitmap. Concurrent humongous object allocation could have changed HeapRegion::end() in the meantime. Fix this by using the actual end of the region instead of HeapRegion::end() for comparison.
Reviewed-by:

*** 886,896 **** public: CheckBitmapClearHRClosure(CMBitMap* bitmap) : _bitmap(bitmap) { } virtual bool doHeapRegion(HeapRegion* r) { ! return _bitmap->getNextMarkedWordAddress(r->bottom(), r->end()) != r->end(); } }; bool ConcurrentMark::nextMarkBitmapIsClear() { CheckBitmapClearHRClosure cl(_nextMarkBitMap); --- 886,900 ---- public: CheckBitmapClearHRClosure(CMBitMap* bitmap) : _bitmap(bitmap) { } virtual bool doHeapRegion(HeapRegion* r) { ! HeapWord* end = r->bottom() + HeapRegion::GrainWords; ! // There cannot be a race when comparing to "end" after the call even if the ! // compiler duplicates the calculation of "end" because r->bottom() is always ! // constant. ! return _bitmap->getNextMarkedWordAddress(r->bottom(), end) != end; } }; bool ConcurrentMark::nextMarkBitmapIsClear() { CheckBitmapClearHRClosure cl(_nextMarkBitMap);