< prev index next >

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

Print this page
rev 55949 : imported patch zgc_discontiguous

@@ -20,42 +20,72 @@
  * 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(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;
 }
 
 ZVirtualMemory ZVirtualMemoryManager::alloc(size_t size, bool alloc_from_front) {
< prev index next >