< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
Print this page
rev 59366 : 8245464: Shenandoah: allocate collection set bitmap at lower addresses
Reviewed-by: XXX
*** 290,302 ****
if (!region_storage.special()) {
os::commit_memory_or_exit(region_storage.base(), region_storage_size, region_page_size, false,
"Cannot commit region memory");
}
_regions = NEW_C_HEAP_ARRAY(ShenandoahHeapRegion*, _num_regions, mtGC);
_free_set = new ShenandoahFreeSet(this, _num_regions);
- _collection_set = new ShenandoahCollectionSet(this, sh_rs.base(), sh_rs.size());
{
ShenandoahHeapLocker locker(lock());
for (size_t i = 0; i < _num_regions; i++) {
--- 290,324 ----
if (!region_storage.special()) {
os::commit_memory_or_exit(region_storage.base(), region_storage_size, region_page_size, false,
"Cannot commit region memory");
}
+ // Try to fit the collection set bitmap at lower addresses. This optimizes code generation for cset checks.
+ // Go up until a sensible limit and try to reserve the space there.
+ // If not successful, bite a bullet and allocate at whatever address.
+ {
+ int cset_align = MAX2(os::vm_page_size(), os::vm_allocation_granularity());
+ uintx cset_size = align_up(((uintx) sh_rs.base() + sh_rs.size()) >> ShenandoahHeapRegion::region_size_bytes_shift(), cset_align);
+ uintptr_t min = round_up_power_of_2(cset_align);
+ uintptr_t max = (1u << 31u);
+ for (uintptr_t cset_base = min; cset_base <= max; cset_base <<= 1u) {
+ ReservedSpace cset_rs(cset_size, os::vm_page_size(), false, (char*) cset_base);
+ if (cset_rs.is_reserved()) {
+ assert((char*)cset_base == cset_rs.base(), "Addresses should agree: " PTR_FORMAT ", " PTR_FORMAT, cset_base, p2i(cset_rs.base()));
+ _collection_set = new ShenandoahCollectionSet(this, cset_rs, sh_rs.base());
+ break;
+ }
+ }
+
+ if (_collection_set == NULL) {
+ ReservedSpace cset_rs(cset_size, os::vm_page_size(), false);
+ _collection_set = new ShenandoahCollectionSet(this, cset_rs, sh_rs.base());
+ }
+ }
+
_regions = NEW_C_HEAP_ARRAY(ShenandoahHeapRegion*, _num_regions, mtGC);
_free_set = new ShenandoahFreeSet(this, _num_regions);
{
ShenandoahHeapLocker locker(lock());
for (size_t i = 0; i < _num_regions; i++) {
< prev index next >