< 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 ****
/*
! * Copyright (c) 2013, 2019, 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.
--- 1,7 ----
/*
! * 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,481 ****
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(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");
// 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)) {
// 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;
--- 443,493 ----
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)) {
// 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());
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,503 ****
} 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.
--- 505,514 ----
*** 510,520 ****
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);
// 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);
--- 521,531 ----
assert(reserved_rgn->committed_size() == 0, "Splitting committed region?");
NativeCallStack original_stack = *reserved_rgn->call_stack();
MEMFLAGS original_flags = reserved_rgn->flag();
! 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 >