# HG changeset patch # User tschatzl # Date 1575019217 -3600 # Node ID 5775e4825e5893a7affab3948b56315008e10c76 # Parent 11ff4e4856708356dab530bd148b26b2fdfacf59 8233998: New young regions registered too early in collection set Reviewed-by: sangheki, sjohanss diff -r 11ff4e485670 -r 5775e4825e58 src/hotspot/share/gc/g1/g1CollectionSet.cpp --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp Fri Nov 29 10:20:16 2019 +0100 +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp Fri Nov 29 10:20:17 2019 +0100 @@ -278,19 +278,6 @@ assert(hr->is_young(), "invariant"); assert(_inc_build_state == Active, "Precondition"); - size_t collection_set_length = _collection_set_cur_length; - // We use UINT_MAX as "invalid" marker in verification. - assert(collection_set_length < (UINT_MAX - 1), - "Collection set is too large with " SIZE_FORMAT " entries", collection_set_length); - hr->set_young_index_in_cset((uint)collection_set_length + 1); - - _collection_set_regions[collection_set_length] = hr->hrm_index(); - // Concurrent readers must observe the store of the value in the array before an - // update to the length field. - OrderAccess::storestore(); - _collection_set_cur_length++; - assert(_collection_set_cur_length <= _collection_set_max_length, "Collection set larger than maximum allowed."); - // This routine is used when: // * adding survivor regions to the incremental cset at the end of an // evacuation pause or @@ -325,6 +312,19 @@ assert(!hr->in_collection_set(), "invariant"); _g1h->register_young_region_with_region_attr(hr); + + size_t collection_set_length = _collection_set_cur_length; + // We use UINT_MAX as "invalid" marker in verification. + assert(collection_set_length < (UINT_MAX - 1), + "Collection set is too large with " SIZE_FORMAT " entries", collection_set_length); + hr->set_young_index_in_cset((uint)collection_set_length + 1); + + _collection_set_regions[collection_set_length] = hr->hrm_index(); + // Concurrent readers must observe the store of the value in the array before an + // update to the length field. + OrderAccess::storestore(); + _collection_set_cur_length++; + assert(_collection_set_cur_length <= _collection_set_max_length, "Collection set larger than maximum allowed."); } void G1CollectionSet::add_survivor_regions(HeapRegion* hr) {