< prev index next >

share/gc/parallel/psOldGen.cpp

Print this page
rev 1 : G1GC+POGC+NVDIMM Patch with latest comments incorporated from all.

@@ -70,14 +70,29 @@
 }
 
 void PSOldGen::initialize_virtual_space(ReservedSpace rs, size_t alignment) {
 
   _virtual_space = new PSVirtualSpace(rs, alignment);
+  if (os::has_nvdimm() && UseParallelOldGC) {
+    if (!_virtual_space->expand_by(_init_gen_size, _nvdimm_fd)) {
+      vm_exit_during_initialization("Could not reserve enough space for "
+                                    "object heap");
+    }
+#if defined (_WINDOWS)
+    // Windows OS does not support incremental mapping for DAX (NVDIMM) File System
+    if (os::has_nvdimm()) {
+      os::close(os::nvdimm_fd());
+    }
+#endif
+    os::set_nvdimm_heapbase((address)(_virtual_space->reserved_low_addr()));
+    os::set_dram_heapbase((address)((char*)_virtual_space->reserved_low_addr() + _max_gen_size));
+  } else {
   if (!_virtual_space->expand_by(_init_gen_size)) {
     vm_exit_during_initialization("Could not reserve enough space for "
                                   "object heap");
   }
+  }
 }
 
 void PSOldGen::initialize_work(const char* perf_data_name, int level) {
   //
   // Basic memory initialization

@@ -273,11 +288,16 @@
   assert_lock_strong(ExpandHeap_lock);
   assert_locked_or_safepoint(Heap_lock);
   if (bytes == 0) {
     return true;  // That's what virtual_space()->expand_by(0) would return
   }
-  bool result = virtual_space()->expand_by(bytes);
+  bool result = false;
+  if (os::has_nvdimm() && UseParallelOldGC) {
+    result = virtual_space()->expand_by(bytes, nvdimm_fd());
+  } else {
+    result = virtual_space()->expand_by(bytes);
+  }
   if (result) {
     if (ZapUnusedHeapArea) {
       // We need to mangle the newly expanded area. The memregion spans
       // end -> new_end, we assume that top -> end is already mangled.
       // Do the mangling before post_resize() is called because
< prev index next >