< prev index next >
src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp
Print this page
@@ -279,10 +279,29 @@
ShenandoahMCVerifyAfterMarkingRegionClosure cl;
_heap->heap_region_iterate(&cl);
#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:
ShenandoahHeap* _heap;
@@ -396,10 +415,13 @@
void ShenandoahMarkCompact::phase2_calculate_target_addresses(ShenandoahHeapRegionSet** copy_queues) {
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());
}
@@ -576,21 +598,11 @@
// the complete marking bitmap is no longer valid. This ensures
// size-based iteration in marked_object_iterate().
_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;
- }
-
} else {
size_t live = r->used();
if (live == 0) {
r->recycle();
_heap->add_free_region(r);
< prev index next >