< prev index next >

src/hotspot/share/memory/virtualspace.cpp

Print this page

        

*** 35,48 **** // ReservedSpace // Dummy constructor ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0), ! _alignment(0), _special(false), _executable(false), _fd_for_heap(-1), _fd_for_nvdimm(-1) { } ! ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1), _fd_for_nvdimm(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { bool has_preferred_page_size = preferred_page_size != 0; // Want to use large pages where possible and pad with small pages. size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1); bool large_pages = page_size != (size_t)os::vm_page_size(); --- 35,48 ---- // ReservedSpace // Dummy constructor ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0), ! _alignment(0), _special(false), _executable(false), _fd_for_heap(-1) { } ! ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { bool has_preferred_page_size = preferred_page_size != 0; // Want to use large pages where possible and pad with small pages. size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1); bool large_pages = page_size != (size_t)os::vm_page_size();
*** 60,77 **** initialize(size, alignment, large_pages, NULL, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, ! char* requested_address) : _fd_for_heap(-1), _fd_for_nvdimm(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, requested_address, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, ! bool executable) : _fd_for_heap(-1), _fd_for_nvdimm(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, NULL, executable); } // Helper method --- 60,77 ---- initialize(size, alignment, large_pages, NULL, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, ! char* requested_address) : _fd_for_heap(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, requested_address, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, ! bool executable) : _fd_for_heap(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, NULL, executable); } // Helper method
*** 170,216 **** !FLAG_IS_DEFAULT(LargePageSizeInBytes))) { log_debug(gc, heap, coops)("Reserve regular memory without large pages"); } } } ! if (base == NULL) { // Optimistically assume that the OSes returns an aligned base pointer. // When reserving a large address range, most OSes seem to align to at // least 64K. // If the memory was requested at a particular address, use // os::attempt_reserve_memory_at() to avoid over mapping something // important. If available space is not detected, return NULL. if (requested_address != 0) { ! base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); ! if (failed_to_reserve_as_requested(base, requested_address, size, false, _fd_for_heap != -1)) { // OS ignored requested address. Try different address. base = NULL; } } else { ! if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { ! base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment, _fd_for_heap); } else { ! base = os::reserve_memory(size, NULL, alignment, _fd_for_heap); } } if (base == NULL) return; // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) { // Base not aligned, retry ! unmap_or_release_memory(base, size, _fd_for_heap != -1 /*is_file_mapped*/); // Make sure that size is aligned size = align_up(size, alignment); ! base = os::reserve_memory_aligned(size, alignment, _fd_for_heap); if (requested_address != 0 && ! failed_to_reserve_as_requested(base, requested_address, size, false, _fd_for_heap != -1)) { // As a result of the alignment constraints, the allocated base differs // from the requested address. Return back to the caller who can // take remedial action (like try again without a requested address). assert(_base == NULL, "should be"); return; --- 170,220 ---- !FLAG_IS_DEFAULT(LargePageSizeInBytes))) { log_debug(gc, heap, coops)("Reserve regular memory without large pages"); } } } ! int fd = -1; ! if (AllocateOldGenAt == NULL && _fd_for_heap != -1) { ! // AllocateHeapAt is in use. ! fd = _fd_for_heap; ! } if (base == NULL) { // Optimistically assume that the OSes returns an aligned base pointer. // When reserving a large address range, most OSes seem to align to at // least 64K. // If the memory was requested at a particular address, use // os::attempt_reserve_memory_at() to avoid over mapping something // important. If available space is not detected, return NULL. if (requested_address != 0) { ! base = os::attempt_reserve_memory_at(size, requested_address, fd); ! if (failed_to_reserve_as_requested(base, requested_address, size, false, fd != -1)) { // OS ignored requested address. Try different address. base = NULL; } } else { ! if (_nvdimm_base_nv != NULL && _fd_for_heap != -1) { ! base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment, fd); } else { ! base = os::reserve_memory(size, NULL, alignment, fd); } } if (base == NULL) return; // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) { // Base not aligned, retry ! unmap_or_release_memory(base, size, fd != -1 /*is_file_mapped*/); // Make sure that size is aligned size = align_up(size, alignment); ! base = os::reserve_memory_aligned(size, alignment, fd); if (requested_address != 0 && ! failed_to_reserve_as_requested(base, requested_address, size, false, fd != -1)) { // As a result of the alignment constraints, the allocated base differs // from the requested address. Return back to the caller who can // take remedial action (like try again without a requested address). assert(_base == NULL, "should be"); return;
*** 223,233 **** _nvdimm_base_nv = NULL; _dram_size = (size_t)size; _size = size; _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true ! if (_fd_for_heap != -1) { _special = true; } } --- 227,237 ---- _nvdimm_base_nv = NULL; _dram_size = (size_t)size; _size = size; _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true ! if (fd != -1) { _special = true; } }
*** 290,301 **** void ReservedSpace::release() { if (is_reserved()) { char *real_base = _base - _noaccess_prefix; const size_t real_size = _size + _noaccess_prefix; // unmap nvdimm ! if (_fd_for_nvdimm != -1) { ! os::unmap_memory(real_base+real_size, _nvdimm_size); } if (special()) { if (_fd_for_heap != -1) { os::unmap_memory(real_base, real_size); } else { --- 294,305 ---- void ReservedSpace::release() { if (is_reserved()) { char *real_base = _base - _noaccess_prefix; const size_t real_size = _size + _noaccess_prefix; // unmap nvdimm ! if (_nvdimm_base != NULL) { ! os::unmap_memory(_nvdimm_base, _nvdimm_size); } if (special()) { if (_fd_for_heap != -1) { os::unmap_memory(real_base, real_size); } else {
*** 361,376 **** if (_base != NULL) { // We tried before, but we didn't like the address delivered. release(); } ! if (_fd_for_nvdimm != -1 && UseG1GC) { char* base_nv = os::reserve_memory(size, requested_address, alignment); initialize_g1gc_nvdimm_dram_sizes(size, alignment); _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM COMPRESSED HEAP. } // If OS doesn't support demand paging for large page memory, we need // to use reserve_memory_special() to reserve and pin the entire region. // If there is a backing file directory for this space then whether // large pages are allocated is up to the filesystem of the backing file. // So we ignore the UseLargePages flag in this case. --- 365,381 ---- if (_base != NULL) { // We tried before, but we didn't like the address delivered. release(); } ! if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { char* base_nv = os::reserve_memory(size, requested_address, alignment); initialize_g1gc_nvdimm_dram_sizes(size, alignment); _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM COMPRESSED HEAP. } + // If OS doesn't support demand paging for large page memory, we need // to use reserve_memory_special() to reserve and pin the entire region. // If there is a backing file directory for this space then whether // large pages are allocated is up to the filesystem of the backing file. // So we ignore the UseLargePages flag in this case.
*** 417,435 **** // If the memory was requested at a particular address, use // os::attempt_reserve_memory_at() to avoid over mapping something // important. If available space is not detected, return NULL. if (requested_address != 0) { ! if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { // first unmap so that OS does not keep trying. os::unmap_memory(_nvdimm_base_nv, _dram_size); base = os::attempt_reserve_memory_at(_dram_size, _nvdimm_base_nv); } else { base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); } } else { ! if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { // first unmap so that OS does not keep trying. os::unmap_memory(_nvdimm_base_nv, _dram_size); base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment); } else { base = os::reserve_memory(size, NULL, alignment, _fd_for_heap); --- 422,440 ---- // If the memory was requested at a particular address, use // os::attempt_reserve_memory_at() to avoid over mapping something // important. If available space is not detected, return NULL. if (requested_address != 0) { ! if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { // first unmap so that OS does not keep trying. os::unmap_memory(_nvdimm_base_nv, _dram_size); base = os::attempt_reserve_memory_at(_dram_size, _nvdimm_base_nv); } else { base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); } } else { ! if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { // first unmap so that OS does not keep trying. os::unmap_memory(_nvdimm_base_nv, _dram_size); base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment); } else { base = os::reserve_memory(size, NULL, alignment, _fd_for_heap);
*** 439,457 **** if (base == NULL) { return; } // Done _base = base; _nvdimm_base = _base-_nvdimm_size; ! if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { _size = _dram_size; } else { _size = size; } _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true ! if (_fd_for_heap != -1) { _special = true; } // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) { --- 444,462 ---- if (base == NULL) { return; } // Done _base = base; _nvdimm_base = _base-_nvdimm_size; ! if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { _size = _dram_size; } else { _size = size; } _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true ! if (_fd_for_heap != -1 && AllocateOldGenAt == NULL) { _special = true; } // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) {
*** 664,687 **** return; } // if AllocateOldGen is used if (AllocateOldGenAt != NULL) { ! _fd_for_nvdimm = os::create_file_for_heap(AllocateOldGenAt); ! if (_fd_for_nvdimm == -1) { vm_exit_during_initialization( err_msg("Could not create file for Heap at location %s", AllocateOldGenAt)); } if (UseParallelOldGC) { // For ParallelOldGC, adaptive sizing picks _old_gen virtual space sizes as needed. // allocate Xmx on NVDIMM as adaptive sizing may put lot of pressure on NVDIMM. ! os::allocate_file(_fd_for_nvdimm, MaxHeapSize); ! os::set_nvdimm_fd(_fd_for_nvdimm); os::set_nvdimm_present(true); } } else { ! _fd_for_nvdimm = -1; } if (heap_allocation_directory != NULL) { _fd_for_heap = os::create_file_for_heap(heap_allocation_directory); if (_fd_for_heap == -1) { --- 669,692 ---- return; } // if AllocateOldGen is used if (AllocateOldGenAt != NULL) { ! _fd_for_heap = os::create_file_for_heap(AllocateOldGenAt); ! if (_fd_for_heap== -1) { vm_exit_during_initialization( err_msg("Could not create file for Heap at location %s", AllocateOldGenAt)); } if (UseParallelOldGC) { // For ParallelOldGC, adaptive sizing picks _old_gen virtual space sizes as needed. // allocate Xmx on NVDIMM as adaptive sizing may put lot of pressure on NVDIMM. ! os::allocate_file(_fd_for_heap, MaxHeapSize); ! os::set_nvdimm_fd(_fd_for_heap); os::set_nvdimm_present(true); } } else { ! _fd_for_heap = -1; } if (heap_allocation_directory != NULL) { _fd_for_heap = os::create_file_for_heap(heap_allocation_directory); if (_fd_for_heap == -1) {
*** 694,704 **** guarantee(is_aligned(size, alignment), "set by caller"); char* base_nv = NULL; _nvdimm_base_nv = NULL; ! if (_fd_for_nvdimm != -1 && UseG1GC) { if (!UseCompressedOops) { // if compressed oops use requested address. initialize_g1gc_nvdimm_dram_sizes(size, alignment); base_nv = os::reserve_memory(size, NULL, alignment); _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM heap --- 699,709 ---- guarantee(is_aligned(size, alignment), "set by caller"); char* base_nv = NULL; _nvdimm_base_nv = NULL; ! if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { if (!UseCompressedOops) { // if compressed oops use requested address. initialize_g1gc_nvdimm_dram_sizes(size, alignment); base_nv = os::reserve_memory(size, NULL, alignment); _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM heap
*** 712,722 **** // It can happen we get a zerobased/unscaled heap with noaccess prefix, // if we had to try at arbitrary address. establish_noaccess_prefix(); } } else { ! if (_fd_for_nvdimm != -1 && UseG1GC) { initialize(_dram_size, alignment, large, NULL, false); } else { initialize(size, alignment, large, NULL, false); } } --- 717,727 ---- // It can happen we get a zerobased/unscaled heap with noaccess prefix, // if we had to try at arbitrary address. establish_noaccess_prefix(); } } else { ! if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { initialize(_dram_size, alignment, large, NULL, false); } else { initialize(size, alignment, large, NULL, false); } }
*** 726,747 **** assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size], "area must be distinguishable from marks for mark-sweep"); if (base() != NULL) { MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); ! if (_fd_for_nvdimm != -1 && UseG1GC) { os::set_nvdimm_present(true); os::set_dram_heapbase((address)_base); os::set_nvdimm_heapbase((address)_nvdimm_base); ! os::set_nvdimm_fd(_fd_for_nvdimm); _size += _nvdimm_size; _base = _nvdimm_base; log_info(gc, heap)("Java DRAM Heap at [%p - %p] & NVDIMM Old Gen at [%p - %p] %ld \n", _nvdimm_base+_nvdimm_size, (char*)(_nvdimm_base+_nvdimm_size+_dram_size), _nvdimm_base, (char*)(_nvdimm_base+_nvdimm_size), size); } } ! if (_fd_for_heap != -1) { os::close(_fd_for_heap); } } // Reserve space for code segment. Same as Java heap only we mark this as --- 731,752 ---- assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size], "area must be distinguishable from marks for mark-sweep"); if (base() != NULL) { MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); ! if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { os::set_nvdimm_present(true); os::set_dram_heapbase((address)_base); os::set_nvdimm_heapbase((address)_nvdimm_base); ! os::set_nvdimm_fd(_fd_for_heap); _size += _nvdimm_size; _base = _nvdimm_base; log_info(gc, heap)("Java DRAM Heap at [%p - %p] & NVDIMM Old Gen at [%p - %p] %ld \n", _nvdimm_base+_nvdimm_size, (char*)(_nvdimm_base+_nvdimm_size+_dram_size), _nvdimm_base, (char*)(_nvdimm_base+_nvdimm_size), size); } } ! if (_fd_for_heap != -1 && AllocateOldGenAt == NULL) { os::close(_fd_for_heap); } } // Reserve space for code segment. Same as Java heap only we mark this as
< prev index next >