src/share/vm/services/virtualMemoryTracker.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/services/virtualMemoryTracker.cpp

src/share/vm/services/virtualMemoryTracker.cpp

Print this page

        

*** 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); } --- 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 **** VirtualMemorySummary::initialize(); } 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"); ! ReservedMemoryRegion rgn(base_addr, size, stack, flag); ! 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); if (node != NULL) { node->data()->set_all_committed(all_committed); return true; } else { return false; --- 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); LinkedListNode<ReservedMemoryRegion>* node; if (reserved_rgn == NULL) { VirtualMemorySummary::record_reserved_memory(size, flag); ! node = _reserved_regions->add(rgn); if (node != NULL) { node->data()->set_all_committed(all_committed); return true; } else { return false;
*** 336,348 **** } } void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) { assert(addr != NULL, "Invalid address"); ReservedMemoryRegion rgn(addr, 1); ! 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); --- 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); 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 **** bool VirtualMemoryTracker::add_committed_region(address addr, size_t size, const NativeCallStack& stack) { assert(addr != NULL, "Invalid address"); assert(size > 0, "Invalid size"); ReservedMemoryRegion rgn(addr, size); ! 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"); ReservedMemoryRegion rgn(addr, size); ! 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"); 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)) { --- 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); 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); 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); assert(reserved_rgn != NULL, "No reserved region"); // uncommit regions within the released region if (!reserved_rgn->remove_uncommitted_region(addr, size)) {
*** 388,398 **** 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); --- 403,413 ---- 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);
*** 403,413 **** 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); if (new_rgn == NULL) { return false; } else { reserved_rgn->move_committed_regions(addr, *new_rgn->data()); return true; --- 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); if (new_rgn == NULL) { return false; } else { reserved_rgn->move_committed_regions(addr, *new_rgn->data()); return true;
*** 416,427 **** } } bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) { ThreadCritical tc; ! LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions.head(); while (head != NULL) { const ReservedMemoryRegion* rgn = head->peek(); if (!walker->do_allocation_site(rgn)) { return false; } --- 431,443 ---- } } bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) { + assert(_reserved_regions != NULL, "Sanity check"); ThreadCritical tc; ! LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head(); while (head != NULL) { const ReservedMemoryRegion* rgn = head->peek(); if (!walker->do_allocation_site(rgn)) { return false; }
*** 437,447 **** 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(); } return true; } --- 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; ! 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