< 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 >