--- old/src/share/vm/gc_implementation/g1/concurrentMark.hpp 2014-04-29 14:52:36.172025105 +0200 +++ new/src/share/vm/gc_implementation/g1/concurrentMark.hpp 2014-04-29 14:52:36.041961873 +0200 @@ -542,8 +542,12 @@ // frequently. HeapRegion* claim_region(uint worker_id); - // It determines whether we've run out of regions to scan - bool out_of_regions() { return _finger == _heap_end; } + // It determines whether we've run out of regions to scan. Note that + // the finger can point past the heap end in case the heap was expanded + // to satisfy an allocation without doing a GC. This is fine, because all + // objects in those regions will be considered live anyway because of + // SATB guarantees (i.e. their TAMS will be equal to bottom). + bool out_of_regions() { return _finger >= _heap_end; } // Returns the task with the given id CMTask* task(int id) {