src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
Print this page
rev 4204 : 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");