# HG changeset patch # User apetrusenko # Date 1268050032 28800 # Node ID b8a8eafd038d4e5d9dda86e041cdb9f555266e48 # Parent 23decd59cae719a69aa18049511010b9df287025 6921710: G1: assert(new_finger >= _finger && new_finger < _region_limit,"invariant") Summary: If CM task was aborted while scanning the last object of the specified region and the size of that object is equal to bitmap's granularity then the next offset would be equal or over the region limit which is exactly what the assertion states. Reviewed-by: ysr, tonyp, jmasa diff -r 23decd59cae7 -r b8a8eafd038d src/share/vm/gc_implementation/g1/concurrentMark.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed Mar 03 13:26:19 2010 -0800 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Mon Mar 08 04:07:12 2010 -0800 @@ -3704,7 +3704,14 @@ // enough to point to the next possible object header (the // bitmap knows by how much we need to move it as it knows its // granularity). - move_finger_to(_nextMarkBitMap->nextWord(_finger)); + assert(_finger < _region_limit, "invariant"); + HeapWord* new_finger = _nextMarkBitMap->nextWord(_finger); + // Check if bitmap iteration was aborted while scanning the last object + if (new_finger >= _region_limit) { + giveup_current_region(); + } else { + move_finger_to(new_finger); + } } } // At this point we have either completed iterating over the