< prev index next >

src/share/vm/gc/g1/g1MarkSweep.cpp

Print this page

        

@@ -277,12 +277,12 @@
         if (obj->is_gc_marked()) {
           obj->init_mark();
         } else {
           assert(hr->is_empty(), "Should have been cleared in phase 2.");
         }
-        hr->reset_during_compaction();
       }
+      hr->reset_during_compaction();
     } else if (!hr->is_pinned()) {
       hr->compact();
     }
     return false;
   }

@@ -332,13 +332,10 @@
 
 void G1PrepareCompactClosure::free_humongous_region(HeapRegion* hr) {
   HeapWord* end = hr->end();
   FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep");
 
-  assert(hr->is_starts_humongous(),
-         "Only the start of a humongous region should be freed.");
-
   hr->set_containing_set(NULL);
   _humongous_regions_removed.increment(1u, hr->capacity());
 
   _g1h->free_humongous_region(hr, &dummy_free_list, false /* par */);
   prepare_for_compaction(hr, end);

@@ -371,19 +368,16 @@
   _g1h->remove_from_old_sets(empty_set, _humongous_regions_removed);
 }
 
 bool G1PrepareCompactClosure::doHeapRegion(HeapRegion* hr) {
   if (hr->is_humongous()) {
-    if (hr->is_starts_humongous()) {
-      oop obj = oop(hr->bottom());
-      if (obj->is_gc_marked()) {
+    oop obj = oop(hr->humongous_start_region()->bottom());
+    if (hr->is_starts_humongous() && obj->is_gc_marked()) {
         obj->forward_to(obj);
-      } else  {
-        free_humongous_region(hr);
       }
-    } else {
-      assert(hr->is_continues_humongous(), "Invalid humongous.");
+    if (!obj->is_gc_marked()) {
+      free_humongous_region(hr);
     }
   } else if (!hr->is_pinned()) {
     prepare_for_compaction(hr, hr->end());
   }
   return false;
< prev index next >