# HG changeset patch # User Roman Kennke # Date 1423694575 -3600 # Node ID c0734957b5058ef2ef50e9a23263480d2b129cdd # Parent 019d45744873e7cb2d9be140e1e97cc4b51cc977 Relaim all-garbage region as early as possible. diff -r 019d45744873 -r c0734957b505 src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp --- 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; } diff -r 019d45744873 -r c0734957b505 src/share/vm/gc_implementation/shenandoah/shenandoahHeapRegionSet.cpp --- 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++; }