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,1773 ****
// 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);
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");
--- 1763,1773 ----
// 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_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,1828 ****
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* old_end = (HeapWord*) _g1_storage.high();
assert(mr.end() == old_end, "post-condition");
ergo_verbose3(ErgoHeapSizing,
"shrink the heap",
--- 1818,1830 ----
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;
! 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,2050 ****
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);
_hrs.initialize((HeapWord*) _g1_reserved.start(),
! (HeapWord*) _g1_reserved.end(),
! _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");
--- 2039,2054 ----
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);
_hrs.initialize((HeapWord*) _g1_reserved.start(),
! (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");