--- old/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp 2016-11-29 13:00:57.999906323 +0100 +++ new/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp 2016-11-29 13:00:57.835909734 +0100 @@ -281,6 +281,25 @@ #endif } +class ShenandoahMCReclaimHumongousRegionClosure : public ShenandoahHeapRegionClosure { +private: + ShenandoahHeap* _heap; +public: + ShenandoahMCReclaimHumongousRegionClosure() : _heap(ShenandoahHeap::heap()) { + } + + bool doHeapRegion(ShenandoahHeapRegion* r) { + if (r->is_humongous_start()) { + oop humongous_obj = oop(r->bottom() + BrooksPointer::word_size()); + if (! _heap->is_marked_complete(humongous_obj)) { + _heap->reclaim_humongous_region_at(r); + } + } + return false; + } +}; + + class ShenandoahPrepareForCompactionObjectClosure : public ObjectClosure { private: @@ -398,6 +417,9 @@ GCTraceTime(Info, gc, phases) time("Phase 2: Compute new object addresses", _gc_timer); ShenandoahHeap* heap = ShenandoahHeap::heap(); + ShenandoahMCReclaimHumongousRegionClosure cl; + heap->heap_region_iterate(&cl); + // Initialize copy queues. for (uint i = 0; i < heap->max_parallel_workers(); i++) { copy_queues[i] = new ShenandoahHeapRegionSet(heap->max_regions()); @@ -578,17 +600,7 @@ _heap->set_complete_top_at_mark_start(r->bottom(), r->bottom()); r->set_in_collection_set(false); if (r->is_humongous()) { - if (r->is_humongous_start()) { - oop humongous_obj = oop(r->bottom() + BrooksPointer::word_size()); - if (! _heap->is_marked_complete(humongous_obj)) { - _heap->reclaim_humongous_region_at(r); - } else { - _live += ShenandoahHeapRegion::RegionSizeBytes; - } - } else { - _live += ShenandoahHeapRegion::RegionSizeBytes; - } - + _live += ShenandoahHeapRegion::RegionSizeBytes; } else { size_t live = r->used(); if (live == 0) {