# HG changeset patch # User apetrusenko # Date 1268902108 25200 # Node ID c8e827e5dc2b57a309dd67dbdc456f4d2ac3b156 # Parent e865c7385a24b106fe8fa645be54f70429adb54b 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 e865c7385a24 -r c8e827e5dc2b hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Mar 11 11:44:43 2010 -0800 +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Mar 18 01:48:28 2010 -0700 @@ -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