< prev index next >

src/hotspot/share/memory/metaspace/metachunk.cpp

Print this page
rev 53600 : imported patch autouncommit-metachunks

@@ -21,10 +21,11 @@
  * questions.
  *
  */
 
 #include "precompiled.hpp"
+#include "logging/log.hpp"
 #include "memory/allocation.hpp"
 #include "memory/metaspace/metachunk.hpp"
 #include "memory/metaspace/occupancyMap.hpp"
 #include "memory/metaspace/virtualSpaceNode.hpp"
 #include "utilities/align.hpp"

@@ -132,10 +133,50 @@
          p2i(this), word_size() * sizeof(MetaWord), required_alignment);
 }
 
 #endif // ASSERT
 
+bool Metachunk::calc_uncommit_range(address* start, size_t* len) const {
+  // All but the first page (which contains the header) can be uncommitted
+  if (size() * sizeof(MetaWord) > (size_t)os::vm_page_size()) {
+    address from = align_up((address)initial_top(), os::vm_page_size());
+    address to = align_down((address)end(), os::vm_page_size());
+    if (from < to) {
+      *start = from;
+      *len = to - from;
+      return true;
+    }
+  }
+  return false;
+}
+
+bool Metachunk::commit() {
+  bool rc = false;
+  address p = NULL; size_t len = 0;
+  if (calc_uncommit_range(&p, &len)) {
+    rc = os::commit_memory((char*)p, len, false);
+    if (rc) {
+      log_info(gc, metaspace)("Committed chunk " PTR_FORMAT " (payload area from " PTR_FORMAT " to " PTR_FORMAT ")",
+                              p2i(this), p2i(p), p2i(p + len));
+    }
+  }
+  return rc;
+}
+
+bool Metachunk::uncommit() {
+  bool rc = false;
+  address p = NULL; size_t len = 0;
+  if (calc_uncommit_range(&p, &len)) {
+    rc = os::uncommit_memory((char*)p, len);
+    if (rc) {
+      log_info(gc, metaspace)("Uncommitted chunk " PTR_FORMAT " (payload area from " PTR_FORMAT " to " PTR_FORMAT ")",
+                              p2i(this), p2i(p), p2i(p + len));
+    }
+  }
+  return rc;
+}
+
 // Helper, returns a descriptive name for the given index.
 const char* chunk_size_name(ChunkIndex index) {
   switch (index) {
     case SpecializedIndex:
       return "specialized";
< prev index next >