< prev index next >

src/hotspot/share/gc/z/zVirtualMemory.cpp

Print this page
rev 55949 : imported patch zgc_discontiguous

*** 20,61 **** * or visit www.oracle.com if you need additional information or have any * questions. */ #include "precompiled.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zVirtualMemory.inline.hpp" #include "logging/log.hpp" #include "services/memTracker.hpp" ZVirtualMemoryManager::ZVirtualMemoryManager() : _manager(), _initialized(false) { log_info(gc, init)("Address Space: " PTR_FORMAT " - " PTR_FORMAT " (" SIZE_FORMAT "T)", ZAddressSpaceStart, ZAddressSpaceEnd, ZAddressSpaceSize / K / G); // Reserve address space ! if (!reserve(ZAddressSpaceStart, ZAddressSpaceSize)) { 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; } ZVirtualMemory ZVirtualMemoryManager::alloc(size_t size, bool alloc_from_front) { --- 20,91 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ #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) { log_info(gc, init)("Address Space: " PTR_FORMAT " - " PTR_FORMAT " (" SIZE_FORMAT "T)", ZAddressSpaceStart, ZAddressSpaceEnd, ZAddressSpaceSize / K / G); // Reserve address space ! if (reserve(0, ZAddressOffsetMax) < MaxHeapSize) { ! log_error(gc)("Failed to reserve enough address space for Java heap"); return; } // Successfully initialized _initialized = true; } bool ZVirtualMemoryManager::is_initialized() const { return _initialized; } ZVirtualMemory ZVirtualMemoryManager::alloc(size_t size, bool alloc_from_front) {
< prev index next >