src/share/vm/services/virtualMemoryTracker.cpp

changeset 7077
36c9011aaead
parent 7074
833b0f92429a
child 7078
c6211b707068
     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;

mercurial