src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

Print this page
rev 4123 : 7163191: G1: introduce a "heap spanning table" abstraction
Summary: Add a heap spanning table and employ it for the heap region sequence table.
Reviewed-by:

@@ -1763,11 +1763,11 @@
     // Then propagate this update to the necessary data structures.
     HeapWord* new_end = (HeapWord*) _g1_storage.high();
     update_committed_space(old_end, new_end);
 
     FreeRegionList expansion_list("Local Expansion List");
-    MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list);
+    MemRegion mr = _hrs.expand_to(new_end, &expansion_list);
     assert(mr.start() == old_end, "post-condition");
     // mr might be a smaller region than what was requested if
     // expand_by() was unable to allocate the HeapRegion instances
     assert(mr.end() <= new_end, "post-condition");
 

@@ -1818,11 +1818,13 @@
   size_t aligned_shrink_bytes =
     ReservedSpace::page_align_size_down(shrink_bytes);
   aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
                                          HeapRegion::GrainBytes);
   uint num_regions_deleted = 0;
-  MemRegion mr = _hrs.shrink_by(aligned_shrink_bytes, &num_regions_deleted);
+  HeapWord* desired_new_end =
+        (HeapWord*) _g1_storage.high() - (aligned_shrink_bytes / HeapWordSize);
+  MemRegion mr = _hrs.shrink_to(desired_new_end, &num_regions_deleted);
   HeapWord* old_end = (HeapWord*) _g1_storage.high();
   assert(mr.end() == old_end, "post-condition");
 
   ergo_verbose3(ErgoHeapSizing,
                 "shrink the heap",

@@ -2037,14 +2039,16 @@
   ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
   _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
                            g1_rs.size()/HeapWordSize);
 
   _g1_storage.initialize(g1_rs, 0);
-  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
+  _g1_committed = MemRegion((HeapWord*) _g1_storage.low(), (size_t) 0);
   _hrs.initialize((HeapWord*) _g1_reserved.start(),
-                  (HeapWord*) _g1_reserved.end(),
-                  _expansion_regions);
+                  (HeapWord*) _g1_reserved.end());
+  assert(_hrs.max_length() == _expansion_regions,
+         err_msg("max length: %u expansion regions: %u",
+                 _hrs.max_length(), _expansion_regions));
 
   // 6843694 - ensure that the maximum region index can fit
   // in the remembered set structures.
   const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
   guarantee((max_regions() - 1) <= max_region_idx, "too many regions");