6939027: G1: assertion failure during the concurrent phase of cleanup
Summary: The outgoing region map is not maintained properly and it's causing an assert failure. Given that we don't actually use it, I'm removing it. I'm piggy-backing a small change on this which removes a message that it's printed before a Full GC when DisableExplicitGC is set.
Reviewed-by: apetrusenko, ysr
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Apr 15 15:52:55 2010 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Apr 15 18:45:30 2010 -0400
@@ -913,7 +913,6 @@
}
if (full && DisableExplicitGC) {
- gclog_or_tty->print("\n\n\nDisabling Explicit GC\n\n\n");
return;
}
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Apr 15 15:52:55 2010 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Apr 15 18:45:30 2010 -0400
@@ -662,8 +662,6 @@
prt = PosParPRT::alloc(from_hr);
}
prt->init(from_hr);
- // Record the outgoing pointer in the from_region's outgoing bitmap.
- from_hr->rem_set()->add_outgoing_reference(hr());
PosParPRT* first_prt = _fine_grain_regions[ind];
prt->set_next(first_prt); // XXX Maybe move to init?
@@ -1073,11 +1071,7 @@
HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetSharedArray* bosa,
HeapRegion* hr)
- : _bosa(bosa), _other_regions(hr),
- _outgoing_region_map(G1CollectedHeap::heap()->max_regions(),
- false /* in-resource-area */),
- _iter_state(Unclaimed)
-{}
+ : _bosa(bosa), _other_regions(hr), _iter_state(Unclaimed) { }
void HeapRegionRemSet::setup_remset_size() {
@@ -1148,30 +1142,11 @@
PosParPRT::par_contract_all();
}
-void HeapRegionRemSet::add_outgoing_reference(HeapRegion* to_hr) {
- _outgoing_region_map.par_at_put(to_hr->hrs_index(), 1);
-}
-
void HeapRegionRemSet::clear() {
- clear_outgoing_entries();
- _outgoing_region_map.clear();
_other_regions.clear();
assert(occupied() == 0, "Should be clear.");
}
-void HeapRegionRemSet::clear_outgoing_entries() {
- G1CollectedHeap* g1h = G1CollectedHeap::heap();
- size_t i = _outgoing_region_map.get_next_one_offset(0);
- while (i < _outgoing_region_map.size()) {
- HeapRegion* to_region = g1h->region_at(i);
- if (!to_region->in_collection_set()) {
- to_region->rem_set()->clear_incoming_entry(hr());
- }
- i = _outgoing_region_map.get_next_one_offset(i+1);
- }
-}
-
-
void HeapRegionRemSet::scrub(CardTableModRefBS* ctbs,
BitMap* region_bm, BitMap* card_bm) {
_other_regions.scrub(ctbs, region_bm, card_bm);
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Thu Apr 15 15:52:55 2010 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Thu Apr 15 18:45:30 2010 -0400
@@ -179,13 +179,6 @@
OtherRegionsTable _other_regions;
- // One set bit for every region that has an entry for this one.
- BitMap _outgoing_region_map;
-
- // Clear entries for the current region in any rem sets named in
- // the _outgoing_region_map.
- void clear_outgoing_entries();
-
enum ParIterState { Unclaimed, Claimed, Complete };
volatile ParIterState _iter_state;
volatile jlong _iter_claimed;
@@ -243,10 +236,6 @@
_other_regions.add_reference(from, tid);
}
- // Records the fact that the current region contains an outgoing
- // reference into "to_hr".
- void add_outgoing_reference(HeapRegion* to_hr);
-
// Removes any entries shown by the given bitmaps to contain only dead
// objects.
void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm);