< 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 >