< prev index next >

src/hotspot/share/services/virtualMemoryTracker.cpp

Print this page
rev 59977 : 8248426: NMT: VirtualMemoryTracker::split_reserved_region() does not properly update summary counting

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -443,39 +443,51 @@
   assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
   bool result = reserved_rgn->remove_uncommitted_region(addr, size);
   return result;
 }
 
+bool VirtualMemoryTracker::remove_released_region(ReservedMemoryRegion* rgn) {
+  assert(rgn != NULL, "Sanity check");
+  assert(_reserved_regions != NULL, "Sanity check");
+
+  // uncommit regions within the released region
+  if (!rgn->remove_uncommitted_region(rgn->base(), rgn->size())) {
+    return false;
+  }
+
+  VirtualMemorySummary::record_released_memory(rgn->size(), rgn->flag());
+  return _reserved_regions->remove(*rgn);
+}
+
 bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
   assert(addr != NULL, "Invalid address");
   assert(size > 0, "Invalid size");
   assert(_reserved_regions != NULL, "Sanity check");
 
   ReservedMemoryRegion  rgn(addr, size);
   ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
 
   assert(reserved_rgn != NULL, "No reserved region");
+  if (reserved_rgn->same_region(addr, size)) {
+    return remove_released_region(reserved_rgn);
+  }
 
   // uncommit regions within the released region
   if (!reserved_rgn->remove_uncommitted_region(addr, size)) {
     return false;
   }
 
   if (reserved_rgn->flag() == mtClassShared &&
-      reserved_rgn->contain_region(addr, size) &&
-      !reserved_rgn->same_region(addr, size)) {
+      reserved_rgn->contain_region(addr, size)) {
     // This is an unmapped CDS region, which is part of the reserved shared
     // memory region.
     // See special handling in VirtualMemoryTracker::add_reserved_region also.
     return true;
   }
 
   VirtualMemorySummary::record_released_memory(size, reserved_rgn->flag());
 
-  if (reserved_rgn->same_region(addr, size)) {
-    return _reserved_regions->remove(rgn);
-  } else {
     assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
     if (reserved_rgn->base() == addr ||
         reserved_rgn->end() == addr + size) {
         reserved_rgn->exclude_region(addr, size);
       return true;

@@ -493,11 +505,10 @@
       } else {
         reserved_rgn->move_committed_regions(addr, *new_rgn->data());
         return true;
       }
     }
-  }
 }
 
 // Given an existing memory mapping registered with NMT, split the mapping in
 //  two. The newly created two mappings will be registered under the call
 //  stack and the memory flags of the original section.

@@ -510,11 +521,11 @@
   assert(reserved_rgn->committed_size() == 0, "Splitting committed region?");
 
   NativeCallStack original_stack = *reserved_rgn->call_stack();
   MEMFLAGS original_flags = reserved_rgn->flag();
 
-  _reserved_regions->remove(rgn);
+  remove_released_region(reserved_rgn);
 
   // Now, create two new regions.
   add_reserved_region(addr, split, original_stack, original_flags);
   add_reserved_region(addr + split, size - split, original_stack, original_flags);
 
< prev index next >