1.1 --- a/src/share/vm/services/virtualMemoryTracker.cpp Tue Aug 12 12:39:02 2014 -0700 1.2 +++ b/src/share/vm/services/virtualMemoryTracker.cpp Thu Aug 14 09:02:51 2014 -0400 1.3 @@ -34,7 +34,7 @@ 1.4 ::new ((void*)_snapshot) VirtualMemorySnapshot(); 1.5 } 1.6 1.7 -SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base> VirtualMemoryTracker::_reserved_regions; 1.8 +SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>* VirtualMemoryTracker::_reserved_regions; 1.9 1.10 int compare_committed_region(const CommittedMemoryRegion& r1, const CommittedMemoryRegion& r2) { 1.11 return r1.compare(r2); 1.12 @@ -283,17 +283,26 @@ 1.13 return true; 1.14 } 1.15 1.16 +bool VirtualMemoryTracker::late_initialize(NMT_TrackingLevel level) { 1.17 + if (level >= NMT_summary) { 1.18 + _reserved_regions = new (std::nothrow, ResourceObj::C_HEAP, mtNMT) 1.19 + SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>(); 1.20 + return (_reserved_regions != NULL); 1.21 + } 1.22 + return true; 1.23 +} 1.24 + 1.25 bool VirtualMemoryTracker::add_reserved_region(address base_addr, size_t size, 1.26 const NativeCallStack& stack, MEMFLAGS flag, bool all_committed) { 1.27 assert(base_addr != NULL, "Invalid address"); 1.28 assert(size > 0, "Invalid size"); 1.29 - 1.30 + assert(_reserved_regions != NULL, "Sanity check"); 1.31 ReservedMemoryRegion rgn(base_addr, size, stack, flag); 1.32 - ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn); 1.33 + ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 1.34 LinkedListNode<ReservedMemoryRegion>* node; 1.35 if (reserved_rgn == NULL) { 1.36 VirtualMemorySummary::record_reserved_memory(size, flag); 1.37 - node = _reserved_regions.add(rgn); 1.38 + node = _reserved_regions->add(rgn); 1.39 if (node != NULL) { 1.40 node->data()->set_all_committed(all_committed); 1.41 return true; 1.42 @@ -338,9 +347,10 @@ 1.43 1.44 void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) { 1.45 assert(addr != NULL, "Invalid address"); 1.46 + assert(_reserved_regions != NULL, "Sanity check"); 1.47 1.48 ReservedMemoryRegion rgn(addr, 1); 1.49 - ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn); 1.50 + ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 1.51 if (reserved_rgn != NULL) { 1.52 assert(reserved_rgn->contain_address(addr), "Containment"); 1.53 if (reserved_rgn->flag() != flag) { 1.54 @@ -354,8 +364,10 @@ 1.55 const NativeCallStack& stack) { 1.56 assert(addr != NULL, "Invalid address"); 1.57 assert(size > 0, "Invalid size"); 1.58 + assert(_reserved_regions != NULL, "Sanity check"); 1.59 + 1.60 ReservedMemoryRegion rgn(addr, size); 1.61 - ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn); 1.62 + ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 1.63 1.64 assert(reserved_rgn != NULL, "No reserved region"); 1.65 assert(reserved_rgn->contain_region(addr, size), "Not completely contained"); 1.66 @@ -365,8 +377,10 @@ 1.67 bool VirtualMemoryTracker::remove_uncommitted_region(address addr, size_t size) { 1.68 assert(addr != NULL, "Invalid address"); 1.69 assert(size > 0, "Invalid size"); 1.70 + assert(_reserved_regions != NULL, "Sanity check"); 1.71 + 1.72 ReservedMemoryRegion rgn(addr, size); 1.73 - ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn); 1.74 + ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 1.75 assert(reserved_rgn != NULL, "No reserved region"); 1.76 assert(reserved_rgn->contain_region(addr, size), "Not completely contained"); 1.77 return reserved_rgn->remove_uncommitted_region(addr, size); 1.78 @@ -375,9 +389,10 @@ 1.79 bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) { 1.80 assert(addr != NULL, "Invalid address"); 1.81 assert(size > 0, "Invalid size"); 1.82 + assert(_reserved_regions != NULL, "Sanity check"); 1.83 1.84 ReservedMemoryRegion rgn(addr, size); 1.85 - ReservedMemoryRegion* reserved_rgn = _reserved_regions.find(rgn); 1.86 + ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 1.87 1.88 assert(reserved_rgn != NULL, "No reserved region"); 1.89 1.90 @@ -390,7 +405,7 @@ 1.91 VirtualMemorySummary::record_released_memory(size, reserved_rgn->flag()); 1.92 1.93 if (reserved_rgn->same_region(addr, size)) { 1.94 - return _reserved_regions.remove(rgn); 1.95 + return _reserved_regions->remove(rgn); 1.96 } else { 1.97 assert(reserved_rgn->contain_region(addr, size), "Not completely contained"); 1.98 if (reserved_rgn->base() == addr || 1.99 @@ -405,7 +420,7 @@ 1.100 1.101 // use original region for lower region 1.102 reserved_rgn->exclude_region(addr, top - addr); 1.103 - LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions.add(high_rgn); 1.104 + LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions->add(high_rgn); 1.105 if (new_rgn == NULL) { 1.106 return false; 1.107 } else { 1.108 @@ -418,8 +433,9 @@ 1.109 1.110 1.111 bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) { 1.112 + assert(_reserved_regions != NULL, "Sanity check"); 1.113 ThreadCritical tc; 1.114 - LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions.head(); 1.115 + LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head(); 1.116 while (head != NULL) { 1.117 const ReservedMemoryRegion* rgn = head->peek(); 1.118 if (!walker->do_allocation_site(rgn)) { 1.119 @@ -439,7 +455,10 @@ 1.120 assert(from == NMT_summary || from == NMT_detail, "Just check"); 1.121 // Clean up virtual memory tracking data structures. 1.122 ThreadCritical tc; 1.123 - _reserved_regions.clear(); 1.124 + if (_reserved_regions != NULL) { 1.125 + delete _reserved_regions; 1.126 + _reserved_regions = NULL; 1.127 + } 1.128 } 1.129 1.130 return true;