Wed, 14 May 2014 14:32:23 +0200
8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime()
Reviewed-by: brutisso, tschatzl
1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed May 14 13:32:44 2014 +0200 1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed May 14 14:32:23 2014 +0200 1.3 @@ -819,7 +819,7 @@ 1.4 // false before we start remark. At this point we should also be 1.5 // in a STW phase. 1.6 assert(!concurrent_marking_in_progress(), "invariant"); 1.7 - assert(_finger == _heap_end, 1.8 + assert(out_of_regions(), 1.9 err_msg("only way to get here: _finger: "PTR_FORMAT", _heap_end: "PTR_FORMAT, 1.10 p2i(_finger), p2i(_heap_end))); 1.11 update_g1_committed(true);
2.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp Wed May 14 13:32:44 2014 +0200 2.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp Wed May 14 14:32:23 2014 +0200 2.3 @@ -542,8 +542,12 @@ 2.4 // frequently. 2.5 HeapRegion* claim_region(uint worker_id); 2.6 2.7 - // It determines whether we've run out of regions to scan. 2.8 - bool out_of_regions() { return _finger == _heap_end; } 2.9 + // It determines whether we've run out of regions to scan. Note that 2.10 + // the finger can point past the heap end in case the heap was expanded 2.11 + // to satisfy an allocation without doing a GC. This is fine, because all 2.12 + // objects in those regions will be considered live anyway because of 2.13 + // SATB guarantees (i.e. their TAMS will be equal to bottom). 2.14 + bool out_of_regions() { return _finger >= _heap_end; } 2.15 2.16 // Returns the task with the given id 2.17 CMTask* task(int id) {