mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 03:54:33 +02:00
8048112: G1 Full GC needs to support the case when the very first region is not available
Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
This commit is contained in:
parent
ce1a131e47
commit
bc56e061ec
7 changed files with 44 additions and 45 deletions
|
@ -201,6 +201,23 @@ class G1PrepareCompactClosure: public HeapRegionClosure {
|
|||
CompactPoint _cp;
|
||||
HeapRegionSetCount _humongous_regions_removed;
|
||||
|
||||
bool is_cp_initialized() const {
|
||||
return _cp.space != NULL;
|
||||
}
|
||||
|
||||
void prepare_for_compaction(HeapRegion* hr, HeapWord* end) {
|
||||
// If this is the first live region that we came across which we can compact,
|
||||
// initialize the CompactPoint.
|
||||
if (!is_cp_initialized()) {
|
||||
_cp.space = hr;
|
||||
_cp.threshold = hr->initialize_threshold();
|
||||
}
|
||||
hr->prepare_for_compaction(&_cp);
|
||||
// Also clear the part of the card table that will be unused after
|
||||
// compaction.
|
||||
_mrbs->clear(MemRegion(hr->compaction_top(), end));
|
||||
}
|
||||
|
||||
void free_humongous_region(HeapRegion* hr) {
|
||||
HeapWord* end = hr->end();
|
||||
FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep");
|
||||
|
@ -212,18 +229,15 @@ class G1PrepareCompactClosure: public HeapRegionClosure {
|
|||
_humongous_regions_removed.increment(1u, hr->capacity());
|
||||
|
||||
_g1h->free_humongous_region(hr, &dummy_free_list, false /* par */);
|
||||
hr->prepare_for_compaction(&_cp);
|
||||
// Also clear the part of the card table that will be unused after
|
||||
// compaction.
|
||||
_mrbs->clear(MemRegion(hr->compaction_top(), end));
|
||||
prepare_for_compaction(hr, end);
|
||||
dummy_free_list.remove_all();
|
||||
}
|
||||
|
||||
public:
|
||||
G1PrepareCompactClosure(CompactibleSpace* cs)
|
||||
G1PrepareCompactClosure()
|
||||
: _g1h(G1CollectedHeap::heap()),
|
||||
_mrbs(_g1h->g1_barrier_set()),
|
||||
_cp(NULL, cs, cs->initialize_threshold()),
|
||||
_cp(NULL),
|
||||
_humongous_regions_removed() { }
|
||||
|
||||
void update_sets() {
|
||||
|
@ -246,10 +260,7 @@ public:
|
|||
assert(hr->continuesHumongous(), "Invalid humongous.");
|
||||
}
|
||||
} else {
|
||||
hr->prepare_for_compaction(&_cp);
|
||||
// Also clear the part of the card table that will be unused after
|
||||
// compaction.
|
||||
_mrbs->clear(MemRegion(hr->compaction_top(), hr->end()));
|
||||
prepare_for_compaction(hr, hr->end());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -267,14 +278,7 @@ void G1MarkSweep::mark_sweep_phase2() {
|
|||
GCTraceTime tm("phase 2", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
|
||||
GenMarkSweep::trace("2");
|
||||
|
||||
// find the first region
|
||||
HeapRegion* r = g1h->region_at(0);
|
||||
CompactibleSpace* sp = r;
|
||||
if (r->isHumongous() && oop(r->bottom())->is_gc_marked()) {
|
||||
sp = r->next_compaction_space();
|
||||
}
|
||||
|
||||
G1PrepareCompactClosure blk(sp);
|
||||
G1PrepareCompactClosure blk;
|
||||
g1h->heap_region_iterate(&blk);
|
||||
blk.update_sets();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue