--- old/src/hotspot/share/gc/z/zVirtualMemory.cpp 2019-08-09 10:45:18.388770256 +0200 +++ new/src/hotspot/share/gc/z/zVirtualMemory.cpp 2019-08-09 10:45:18.124770265 +0200 @@ -22,11 +22,51 @@ */ #include "precompiled.hpp" +#include "gc/z/zAddress.inline.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zVirtualMemory.inline.hpp" #include "logging/log.hpp" #include "services/memTracker.hpp" +bool ZVirtualMemoryManager::reserve_range(uintptr_t start, size_t size) { + // Reserve address space + char* const marked0_addr = (char*)ZAddress::marked0(start); + char* const marked1_addr = (char*)ZAddress::marked1(start); + char* const remapped_addr = (char*)ZAddress::remapped(start); + + if (!os::attempt_reserve_memory_at(size, marked0_addr)) { + return false; + } + + if (!os::attempt_reserve_memory_at(size, marked1_addr)) { + os::release_memory(marked0_addr, size); + return false; + } + + if (!os::attempt_reserve_memory_at(size, remapped_addr)) { + os::release_memory(marked0_addr, size); + os::release_memory(marked1_addr, size); + return false; + } + + // Make the address view free + _manager.free(start, size); + return true; +} + +size_t ZVirtualMemoryManager::reserve(uintptr_t start, size_t size) { + if (reserve_range(start, size)) { + return size; + } + + if (size <= ZGranuleSize) { + return 0; + } + + const size_t range = size / 2; + return reserve(start, range) + reserve(start + range, range); +} + ZVirtualMemoryManager::ZVirtualMemoryManager() : _manager(), _initialized(false) { @@ -35,25 +75,15 @@ ZAddressSpaceStart, ZAddressSpaceEnd, ZAddressSpaceSize / K / G); // Reserve address space - if (!reserve(ZAddressSpaceStart, ZAddressSpaceSize)) { + if (reserve(0, ZAddressOffsetMax) < MaxHeapSize) { + log_error(gc)("Failed to reserve enough address space for Java heap"); return; } - // Make the complete address view free - _manager.free(0, ZAddressOffsetMax); - - // Register address space with native memory tracker - nmt_reserve(ZAddressSpaceStart, ZAddressSpaceSize); - // Successfully initialized _initialized = true; } -void ZVirtualMemoryManager::nmt_reserve(uintptr_t start, size_t size) { - MemTracker::record_virtual_memory_reserve((void*)start, size, CALLER_PC); - MemTracker::record_virtual_memory_type((void*)start, mtJavaHeap); -} - bool ZVirtualMemoryManager::is_initialized() const { return _initialized; }