< prev index next >
src/hotspot/share/gc/g1/g1RemSet.cpp
Print this page
*** 584,593 ****
--- 584,607 ----
// we see the up-to-date region type here.
if (!r->is_old_or_humongous()) {
return;
}
+ // While we are processing RSet buffers during the collection, we
+ // actually don't want to scan any cards on the collection set,
+ // since we don't want to update remembered sets with entries that
+ // point into the collection set, given that live objects from the
+ // collection set are about to move and such entries will be stale
+ // very soon. This change also deals with a reliability issue which
+ // involves scanning a card in the collection set and coming across
+ // an array that was being chunked and looking malformed. Note,
+ // however, that if evacuation fails, we have to scan any objects
+ // that were not moved and create any missing entries.
+ if (r->in_collection_set()) {
+ return;
+ }
+
// The result from the hot card cache insert call is either:
// * pointer to the current card
// (implying that the current card is not 'hot'),
// * null
// (meaning we had inserted the card ptr into the "hot" card cache,
*** 608,618 ****
start = _ct_bs->addr_for(card_ptr);
r = _g1->heap_region_containing(start);
// Check whether the region formerly in the cache should be
// ignored, as discussed earlier for the original card. The
! // region could have been freed while in the cache.
if (!r->is_old_or_humongous()) {
return;
}
} // Else we still have the original card.
}
--- 622,633 ----
start = _ct_bs->addr_for(card_ptr);
r = _g1->heap_region_containing(start);
// Check whether the region formerly in the cache should be
// ignored, as discussed earlier for the original card. The
! // region could have been freed while in the cache. The cset is
! // not relevant here, since we're in concurrent phase.
if (!r->is_old_or_humongous()) {
return;
}
} // Else we still have the original card.
}
< prev index next >