< prev index next >

src/hotspot/share/gc/g1/g1CollectionSet.cpp

Print this page
rev 57223 : imported patch 8225484-changes-to-survivor-calculation

@@ -64,10 +64,11 @@
   _num_optional_regions(0),
   _bytes_used_before(0),
   _recorded_rs_length(0),
   _inc_build_state(Inactive),
   _inc_part_start(0),
+  _cur_eden_young_idx(0),
   _inc_collection_set_stats(NULL),
   _inc_bytes_used_before(0),
   _inc_recorded_rs_length(0),
   _inc_recorded_rs_length_diff(0),
   _inc_predicted_non_copy_time_ms(0.0),

@@ -160,10 +161,11 @@
   _inc_recorded_rs_length_diff = 0;
   _inc_predicted_non_copy_time_ms = 0.0;
   _inc_predicted_non_copy_time_ms_diff = 0.0;
 
   update_incremental_marker();
+  _cur_eden_young_idx = 0;
 }
 
 void G1CollectionSet::finalize_incremental_building() {
   assert(_inc_build_state == Active, "Precondition");
   assert(SafepointSynchronize::is_at_safepoint(), "should be at a safepoint");

@@ -304,15 +306,10 @@
   }
 
   assert(!hr->in_collection_set(), "invariant");
   _g1h->register_young_region_with_region_attr(hr);
 
-  // We use UINT_MAX as "invalid" marker in verification.
-  assert(_collection_set_cur_length < (UINT_MAX - 1),
-         "Collection set is too large with " SIZE_FORMAT " entries", _collection_set_cur_length);
-  hr->set_young_index_in_cset((uint)_collection_set_cur_length + 1);
-
   _collection_set_regions[_collection_set_cur_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++;

@@ -320,14 +317,22 @@
 }
 
 void G1CollectionSet::add_survivor_regions(HeapRegion* hr) {
   assert(hr->is_survivor(), "Must only add survivor regions, but is %s", hr->get_type_str());
   add_young_region_common(hr);
+  _survivor_region_length++;
 }
 
 void G1CollectionSet::add_eden_region(HeapRegion* hr) {
   assert(hr->is_eden(), "Must only add eden regions, but is %s", hr->get_type_str());
+  assert(_collection_set_cur_length <= INT_MAX, "Collection set is too large with %d entries", (int)_collection_set_cur_length);
+
+  // Young index for eden regions should start at 1. 0 is reserved for other region types.
+  uint next_eden_young_idx = ++_cur_eden_young_idx;
+  assert(next_eden_young_idx > 0, "Invalid next young region idx %d", next_eden_young_idx);
+  hr->set_young_index_in_cset(next_eden_young_idx);
+
   add_young_region_common(hr);
 }
 
 #ifndef PRODUCT
 class G1VerifyYoungAgesClosure : public HeapRegionClosure {

@@ -337,17 +342,23 @@
   G1VerifyYoungAgesClosure() : HeapRegionClosure(), _valid(true) { }
 
   virtual bool do_heap_region(HeapRegion* r) {
     guarantee(r->is_young(), "Region must be young but is %s", r->get_type_str());
 
+    if (r->is_survivor()) {
+      assert(r->survivor_bytes() > 0, "## encountered survivor region without contents");
+      assert(!r->has_surv_rate_group(), "## encountered surv_rate_group in survivor region");
+      return false;
+    }
+
     if (!r->has_surv_rate_group()) {
-      log_error(gc, verify)("## encountered young region without surv_rate_group");
+      log_error(gc, verify)("## encountered eden region without surv_rate_group");
       _valid = false;
     }
 
     if (!r->has_valid_age_in_surv_rate()) {
-      log_error(gc, verify)("## encountered invalid age in young region");
+      log_error(gc, verify)("## encountered invalid age in eden region");
       _valid = false;
     }
 
     return false;
   }

@@ -557,18 +568,21 @@
   }
 
   virtual bool do_heap_region(HeapRegion* r) {
     const uint idx = r->young_index_in_cset();
 
-    assert(idx > 0, "Young index must be set for all regions in the incremental collection set but is not for region %u.", r->hrm_index());
-    assert(idx <= _young_length, "Young cset index %u too large for region %u", idx, r->hrm_index());
+    assert(idx > 0 || r->survivor_bytes() > 0,
+           "Young index must be set for all regions not having survivor bytes but region %u.",
+           r->hrm_index());
+    assert(idx == 0 || idx <= _young_length, "Young cset index %u too large for region %u", idx, r->hrm_index());
 
+    if (idx != 0) {
     assert(_heap_region_indices[idx] == UINT_MAX,
            "Index %d used by multiple regions, first use by region %u, second by region %u",
            idx, _heap_region_indices[idx], r->hrm_index());
-
     _heap_region_indices[idx] = r->hrm_index();
+    }
 
     return false;
   }
 };
 
< prev index next >