src/share/vm/runtime/os.cpp

changeset 7074
833b0f92429a
parent 7032
fa62fb12cdca
child 7177
ed3d653e4012
     1.1 --- a/src/share/vm/runtime/os.cpp	Wed Aug 27 09:36:55 2014 +0200
     1.2 +++ b/src/share/vm/runtime/os.cpp	Wed Aug 27 08:19:12 2014 -0400
     1.3 @@ -49,6 +49,7 @@
     1.4  #include "runtime/stubRoutines.hpp"
     1.5  #include "runtime/thread.inline.hpp"
     1.6  #include "services/attachListener.hpp"
     1.7 +#include "services/nmtCommon.hpp"
     1.8  #include "services/memTracker.hpp"
     1.9  #include "services/threadService.hpp"
    1.10  #include "utilities/defaultStream.hpp"
    1.11 @@ -561,7 +562,11 @@
    1.12    return ptr;
    1.13  }
    1.14  
    1.15 -void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
    1.16 +void* os::malloc(size_t size, MEMFLAGS flags) {
    1.17 +  return os::malloc(size, flags, CALLER_PC);
    1.18 +}
    1.19 +
    1.20 +void* os::malloc(size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
    1.21    NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
    1.22    NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
    1.23  
    1.24 @@ -587,11 +592,15 @@
    1.25      size = 1;
    1.26    }
    1.27  
    1.28 +  // NMT support
    1.29 +  NMT_TrackingLevel level = MemTracker::tracking_level();
    1.30 +  size_t            nmt_header_size = MemTracker::malloc_header_size(level);
    1.31 +
    1.32  #ifndef ASSERT
    1.33 -  const size_t alloc_size = size;
    1.34 +  const size_t alloc_size = size + nmt_header_size;
    1.35  #else
    1.36 -  const size_t alloc_size = GuardedMemory::get_total_size(size);
    1.37 -  if (size > alloc_size) { // Check for rollover.
    1.38 +  const size_t alloc_size = GuardedMemory::get_total_size(size + nmt_header_size);
    1.39 +  if (size + nmt_header_size > alloc_size) { // Check for rollover.
    1.40      return NULL;
    1.41    }
    1.42  #endif
    1.43 @@ -610,7 +619,7 @@
    1.44      return NULL;
    1.45    }
    1.46    // Wrap memory with guard
    1.47 -  GuardedMemory guarded(ptr, size);
    1.48 +  GuardedMemory guarded(ptr, size + nmt_header_size);
    1.49    ptr = guarded.get_user_ptr();
    1.50  #endif
    1.51    if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
    1.52 @@ -623,48 +632,50 @@
    1.53    }
    1.54  
    1.55    // we do not track guard memory
    1.56 -  MemTracker::record_malloc((address)ptr, size, memflags, caller == 0 ? CALLER_PC : caller);
    1.57 -
    1.58 -  return ptr;
    1.59 +  return MemTracker::record_malloc((address)ptr, size, memflags, stack, level);
    1.60  }
    1.61  
    1.62 +void* os::realloc(void *memblock, size_t size, MEMFLAGS flags) {
    1.63 +  return os::realloc(memblock, size, flags, CALLER_PC);
    1.64 +}
    1.65  
    1.66 -void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) {
    1.67 +void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
    1.68  #ifndef ASSERT
    1.69    NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
    1.70    NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
    1.71 -  MemTracker::Tracker tkr = MemTracker::get_realloc_tracker();
    1.72 -  void* ptr = ::realloc(memblock, size);
    1.73 -  if (ptr != NULL) {
    1.74 -    tkr.record((address)memblock, (address)ptr, size, memflags,
    1.75 -     caller == 0 ? CALLER_PC : caller);
    1.76 -  } else {
    1.77 -    tkr.discard();
    1.78 -  }
    1.79 -  return ptr;
    1.80 +   // NMT support
    1.81 +  void* membase = MemTracker::record_free(memblock);
    1.82 +  NMT_TrackingLevel level = MemTracker::tracking_level();
    1.83 +  size_t  nmt_header_size = MemTracker::malloc_header_size(level);
    1.84 +  void* ptr = ::realloc(membase, size + nmt_header_size);
    1.85 +  return MemTracker::record_malloc(ptr, size, memflags, stack, level);
    1.86  #else
    1.87    if (memblock == NULL) {
    1.88 -    return os::malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
    1.89 +    return os::malloc(size, memflags, stack);
    1.90    }
    1.91    if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
    1.92      tty->print_cr("os::realloc caught " PTR_FORMAT, memblock);
    1.93      breakpoint();
    1.94    }
    1.95 -  verify_memory(memblock);
    1.96 +  // NMT support
    1.97 +  void* membase = MemTracker::malloc_base(memblock);
    1.98 +  verify_memory(membase);
    1.99    NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
   1.100    if (size == 0) {
   1.101      return NULL;
   1.102    }
   1.103    // always move the block
   1.104 -  void* ptr = os::malloc(size, memflags, caller == 0 ? CALLER_PC : caller);
   1.105 +  void* ptr = os::malloc(size, memflags, stack);
   1.106    if (PrintMalloc) {
   1.107      tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
   1.108    }
   1.109    // Copy to new memory if malloc didn't fail
   1.110    if ( ptr != NULL ) {
   1.111 -    GuardedMemory guarded(memblock);
   1.112 -    memcpy(ptr, memblock, MIN2(size, guarded.get_user_size()));
   1.113 -    if (paranoid) verify_memory(ptr);
   1.114 +    GuardedMemory guarded(MemTracker::malloc_base(memblock));
   1.115 +    // Guard's user data contains NMT header
   1.116 +    size_t memblock_size = guarded.get_user_size() - MemTracker::malloc_header_size(memblock);
   1.117 +    memcpy(ptr, memblock, MIN2(size, memblock_size));
   1.118 +    if (paranoid) verify_memory(MemTracker::malloc_base(ptr));
   1.119      if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
   1.120        tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
   1.121        breakpoint();
   1.122 @@ -677,7 +688,6 @@
   1.123  
   1.124  
   1.125  void  os::free(void *memblock, MEMFLAGS memflags) {
   1.126 -  address trackp = (address) memblock;
   1.127    NOT_PRODUCT(inc_stat_counter(&num_frees, 1));
   1.128  #ifdef ASSERT
   1.129    if (memblock == NULL) return;
   1.130 @@ -685,20 +695,22 @@
   1.131      if (tty != NULL) tty->print_cr("os::free caught " PTR_FORMAT, memblock);
   1.132      breakpoint();
   1.133    }
   1.134 -  verify_memory(memblock);
   1.135 +  void* membase = MemTracker::record_free(memblock);
   1.136 +  verify_memory(membase);
   1.137    NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
   1.138  
   1.139 -  GuardedMemory guarded(memblock);
   1.140 +  GuardedMemory guarded(membase);
   1.141    size_t size = guarded.get_user_size();
   1.142    inc_stat_counter(&free_bytes, size);
   1.143 -  memblock = guarded.release_for_freeing();
   1.144 +  membase = guarded.release_for_freeing();
   1.145    if (PrintMalloc && tty != NULL) {
   1.146 -      fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)memblock);
   1.147 +      fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)membase);
   1.148    }
   1.149 +  ::free(membase);
   1.150 +#else
   1.151 +  void* membase = MemTracker::record_free(memblock);
   1.152 +  ::free(membase);
   1.153  #endif
   1.154 -  MemTracker::record_free(trackp, memflags);
   1.155 -
   1.156 -  ::free(memblock);
   1.157  }
   1.158  
   1.159  void os::init_random(long initval) {
   1.160 @@ -1412,7 +1424,7 @@
   1.161  char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
   1.162    char* result = pd_reserve_memory(bytes, addr, alignment_hint);
   1.163    if (result != NULL) {
   1.164 -    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
   1.165 +    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
   1.166    }
   1.167  
   1.168    return result;
   1.169 @@ -1422,7 +1434,7 @@
   1.170     MEMFLAGS flags) {
   1.171    char* result = pd_reserve_memory(bytes, addr, alignment_hint);
   1.172    if (result != NULL) {
   1.173 -    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
   1.174 +    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
   1.175      MemTracker::record_virtual_memory_type((address)result, flags);
   1.176    }
   1.177  
   1.178 @@ -1432,7 +1444,7 @@
   1.179  char* os::attempt_reserve_memory_at(size_t bytes, char* addr) {
   1.180    char* result = pd_attempt_reserve_memory_at(bytes, addr);
   1.181    if (result != NULL) {
   1.182 -    MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
   1.183 +    MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
   1.184    }
   1.185    return result;
   1.186  }
   1.187 @@ -1472,23 +1484,29 @@
   1.188  }
   1.189  
   1.190  bool os::uncommit_memory(char* addr, size_t bytes) {
   1.191 -  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
   1.192 -  bool res = pd_uncommit_memory(addr, bytes);
   1.193 -  if (res) {
   1.194 -    tkr.record((address)addr, bytes);
   1.195 +  bool res;
   1.196 +  if (MemTracker::tracking_level() > NMT_minimal) {
   1.197 +    Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
   1.198 +    res = pd_uncommit_memory(addr, bytes);
   1.199 +    if (res) {
   1.200 +      tkr.record((address)addr, bytes);
   1.201 +    }
   1.202    } else {
   1.203 -    tkr.discard();
   1.204 +    res = pd_uncommit_memory(addr, bytes);
   1.205    }
   1.206    return res;
   1.207  }
   1.208  
   1.209  bool os::release_memory(char* addr, size_t bytes) {
   1.210 -  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
   1.211 -  bool res = pd_release_memory(addr, bytes);
   1.212 -  if (res) {
   1.213 -    tkr.record((address)addr, bytes);
   1.214 +  bool res;
   1.215 +  if (MemTracker::tracking_level() > NMT_minimal) {
   1.216 +    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
   1.217 +    res = pd_release_memory(addr, bytes);
   1.218 +    if (res) {
   1.219 +      tkr.record((address)addr, bytes);
   1.220 +    }
   1.221    } else {
   1.222 -    tkr.discard();
   1.223 +    res = pd_release_memory(addr, bytes);
   1.224    }
   1.225    return res;
   1.226  }
   1.227 @@ -1499,7 +1517,7 @@
   1.228                             bool allow_exec) {
   1.229    char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec);
   1.230    if (result != NULL) {
   1.231 -    MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, mtNone, CALLER_PC);
   1.232 +    MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
   1.233    }
   1.234    return result;
   1.235  }
   1.236 @@ -1512,12 +1530,15 @@
   1.237  }
   1.238  
   1.239  bool os::unmap_memory(char *addr, size_t bytes) {
   1.240 -  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
   1.241 -  bool result = pd_unmap_memory(addr, bytes);
   1.242 -  if (result) {
   1.243 -    tkr.record((address)addr, bytes);
   1.244 +  bool result;
   1.245 +  if (MemTracker::tracking_level() > NMT_minimal) {
   1.246 +    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
   1.247 +    result = pd_unmap_memory(addr, bytes);
   1.248 +    if (result) {
   1.249 +      tkr.record((address)addr, bytes);
   1.250 +    }
   1.251    } else {
   1.252 -    tkr.discard();
   1.253 +    result = pd_unmap_memory(addr, bytes);
   1.254    }
   1.255    return result;
   1.256  }

mercurial