src/share/vm/services/virtualMemoryTracker.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/services/virtualMemoryTracker.cpp Wed Aug 13 15:35:42 2014
--- new/src/share/vm/services/virtualMemoryTracker.cpp Wed Aug 13 15:35:41 2014
*** 32,42 ****
--- 32,42 ----
assert(sizeof(_snapshot) >= sizeof(VirtualMemorySnapshot), "Sanity Check");
// Use placement operator new to initialize static data area.
::new ((void*)_snapshot) VirtualMemorySnapshot();
}
! SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>* VirtualMemoryTracker::_reserved_regions;
int compare_committed_region(const CommittedMemoryRegion& r1, const CommittedMemoryRegion& r2) {
return r1.compare(r2);
}
*** 281,301 ****
--- 281,310 ----
VirtualMemorySummary::initialize();
}
return true;
}
+ bool VirtualMemoryTracker::late_initialize(NMT_TrackingLevel level) {
+ if (level >= NMT_summary) {
+ _reserved_regions = new (std::nothrow, ResourceObj::C_HEAP, mtNMT)
+ SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>();
+ return (_reserved_regions != NULL);
+ }
+ return true;
+ }
+
bool VirtualMemoryTracker::add_reserved_region(address base_addr, size_t size,
const NativeCallStack& stack, MEMFLAGS flag, bool all_committed) {
assert(base_addr != NULL, "Invalid address");
assert(size > 0, "Invalid size");
+ assert(_reserved_regions != NULL, "Sanity check");
ReservedMemoryRegion rgn(base_addr, size, stack, flag);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
LinkedListNode<ReservedMemoryRegion>* node;
if (reserved_rgn == NULL) {
VirtualMemorySummary::record_reserved_memory(size, flag);
! node = _reserved_regions.add(rgn);
! node = _reserved_regions->add(rgn);
if (node != NULL) {
node->data()->set_all_committed(all_committed);
return true;
} else {
return false;
*** 336,348 ****
--- 345,358 ----
}
}
void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) {
assert(addr != NULL, "Invalid address");
+ assert(_reserved_regions != NULL, "Sanity check");
ReservedMemoryRegion rgn(addr, 1);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
if (reserved_rgn != NULL) {
assert(reserved_rgn->contain_address(addr), "Containment");
if (reserved_rgn->flag() != flag) {
assert(reserved_rgn->flag() == mtNone, "Overwrite memory type");
reserved_rgn->set_flag(flag);
*** 352,385 ****
--- 362,400 ----
bool VirtualMemoryTracker::add_committed_region(address addr, size_t size,
const NativeCallStack& stack) {
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);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
assert(reserved_rgn != NULL, "No reserved region");
assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
return reserved_rgn->add_committed_region(addr, size, stack);
}
bool VirtualMemoryTracker::remove_uncommitted_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);
! ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
assert(reserved_rgn != NULL, "No reserved region");
assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
return reserved_rgn->remove_uncommitted_region(addr, size);
}
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);
! 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)) {
*** 388,398 ****
--- 403,413 ----
VirtualMemorySummary::record_released_memory(size, reserved_rgn->flag());
if (reserved_rgn->same_region(addr, size)) {
! return _reserved_regions.remove(rgn);
! 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);
*** 403,413 ****
--- 418,428 ----
ReservedMemoryRegion high_rgn(high_base, top - high_base,
*reserved_rgn->call_stack(), reserved_rgn->flag());
// use original region for lower region
reserved_rgn->exclude_region(addr, top - addr);
! LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions.add(high_rgn);
! LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions->add(high_rgn);
if (new_rgn == NULL) {
return false;
} else {
reserved_rgn->move_committed_regions(addr, *new_rgn->data());
return true;
*** 416,427 ****
--- 431,443 ----
}
}
bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) {
+ assert(_reserved_regions != NULL, "Sanity check");
ThreadCritical tc;
! LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions.head();
! LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head();
while (head != NULL) {
const ReservedMemoryRegion* rgn = head->peek();
if (!walker->do_allocation_site(rgn)) {
return false;
}
*** 437,447 ****
--- 453,466 ----
VirtualMemorySummary::reset();
} else if (to == NMT_minimal) {
assert(from == NMT_summary || from == NMT_detail, "Just check");
// Clean up virtual memory tracking data structures.
ThreadCritical tc;
_reserved_regions.clear();
+ if (_reserved_regions != NULL) {
+ delete _reserved_regions;
+ _reserved_regions = NULL;
+ }
}
return true;
}
src/share/vm/services/virtualMemoryTracker.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File