void G1PrepareCompactClosure::free_humongous_region(HeapRegion* hr) { HeapWord* end = hr->end(); FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep"); hr->set_containing_set(NULL); _humongous_regions_removed++; _g1h->free_humongous_region(hr, &dummy_free_list, false /* skip_remset */); prepare_for_compaction(hr, end); dummy_free_list.remove_all(); }
bool G1PrepareCompactClosure::doHeapRegion(HeapRegion* hr) { if (hr->is_humongous()) { oop obj = oop(hr->humongous_start_region()->bottom()); if (hr->is_starts_humongous() && obj->is_gc_marked()) { obj->forward_to(obj); } if (!obj->is_gc_marked()) { free_humongous_region(hr); } } else if (!hr->is_pinned()) { prepare_for_compaction(hr, hr->end()); } return false; }
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); dummy_free_list.remove_all(); }
bool G1PrepareCompactClosure::doHeapRegion(HeapRegion* hr) { if (hr->is_humongous()) { if (hr->is_starts_humongous()) { oop obj = oop(hr->bottom()); if (obj->is_gc_marked()) { obj->forward_to(obj); } else { free_humongous_region(hr); } } else { assert(hr->is_continues_humongous(), "Invalid humongous."); } } else if (!hr->is_pinned()) { prepare_for_compaction(hr, hr->end()); } return false; }