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