changeset 7462:c0734957b505

Relaim all-garbage region as early as possible.
author Roman Kennke <rkennke@redhat.com>
date Wed, 11 Feb 2015 23:42:55 +0100
parents 019d45744873
children 7c17c9b67762
files src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp src/share/vm/gc_implementation/shenandoah/shenandoahHeapRegionSet.cpp
diffstat 2 files changed, 13 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Wed Feb 11 18:05:46 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Wed Feb 11 23:42:55 2015 +0100
@@ -786,9 +786,7 @@
 
 void ShenandoahHeap::parallel_evacuate_region(ShenandoahHeapRegion* from_region) {
 
-  if (from_region->getLiveData() == 0) {
-    return;
-  }
+  assert(from_region->getLiveData() > 0, "all-garbage regions are reclaimed earlier");
 
   ParallelEvacuateRegionObjectClosure evacuate_region(this);
   
@@ -836,10 +834,9 @@
 	from_hr->print();
       }
 
-      // Not sure if the check is worth it or not.
-      if (from_hr->getLiveData() != 0) {
-	_sh->parallel_evacuate_region(from_hr);
-      }
+      assert(from_hr->getLiveData() > 0, "all-garbage regions are reclaimed early");
+      _sh->parallel_evacuate_region(from_hr);
+
       if (_sh->cancelled_evacuation()) {
         break;
       }
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeapRegionSet.cpp	Wed Feb 11 18:05:46 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeapRegionSet.cpp	Wed Feb 11 23:42:55 2015 +0100
@@ -167,8 +167,15 @@
     if (region->garbage() > _garbage_threshold && ! region->is_humonguous()) {
 
       assert(! region->is_humonguous(), "no humonguous regions in collection set");
-      append(region);
-      region->set_is_in_collection_set(true);
+
+      if (region->getLiveData() == 0) {
+        // We can recycle it right away and put it in the free set.
+        tty->print_cr("recycling all garbage region early");
+        region->recycle();
+      } else {
+        append(region);
+        region->set_is_in_collection_set(true);
+      }
     }
     r++;
   }