changeset 17950:8a140676873f

8040804: G1: Concurrent mark stuck in loop calling os::elapsedVTime() Reviewed-by: brutisso, tschatzl
author pliden
date Wed, 14 May 2014 14:32:23 +0200
parents 487f09bf44e0
children 6a0ad2977919
files src/share/vm/gc_implementation/g1/concurrentMark.cpp src/share/vm/gc_implementation/g1/concurrentMark.hpp
diffstat 2 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Wed May 14 13:32:44 2014 +0200
+++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Wed May 14 14:32:23 2014 +0200
@@ -819,7 +819,7 @@
     // false before we start remark. At this point we should also be
     // in a STW phase.
     assert(!concurrent_marking_in_progress(), "invariant");
-    assert(_finger == _heap_end,
+    assert(out_of_regions(),
            err_msg("only way to get here: _finger: "PTR_FORMAT", _heap_end: "PTR_FORMAT,
                    p2i(_finger), p2i(_heap_end)));
     update_g1_committed(true);
--- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Wed May 14 13:32:44 2014 +0200
+++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Wed May 14 14:32:23 2014 +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) {