src/os/linux/vm/os_linux.cpp

changeset 7074
833b0f92429a
parent 6918
d22136881b85
child 7089
6e0cb14ce59b
     1.1 --- a/src/os/linux/vm/os_linux.cpp	Wed Aug 27 09:36:55 2014 +0200
     1.2 +++ b/src/os/linux/vm/os_linux.cpp	Wed Aug 27 08:19:12 2014 -0400
     1.3 @@ -3501,9 +3501,12 @@
     1.4  
     1.5    assert(is_ptr_aligned(start, alignment), "Must be");
     1.6  
     1.7 -  // os::reserve_memory_special will record this memory area.
     1.8 -  // Need to release it here to prevent overlapping reservations.
     1.9 -  MemTracker::record_virtual_memory_release((address)start, bytes);
    1.10 +  if (MemTracker::tracking_level() > NMT_minimal) {
    1.11 +    // os::reserve_memory_special will record this memory area.
    1.12 +    // Need to release it here to prevent overlapping reservations.
    1.13 +    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
    1.14 +    tkr.record((address)start, bytes);
    1.15 +  }
    1.16  
    1.17    char* end = start + bytes;
    1.18  
    1.19 @@ -3598,7 +3601,7 @@
    1.20      }
    1.21  
    1.22      // The memory is committed
    1.23 -    MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
    1.24 +    MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC);
    1.25    }
    1.26  
    1.27    return addr;
    1.28 @@ -3614,24 +3617,30 @@
    1.29  }
    1.30  
    1.31  bool os::release_memory_special(char* base, size_t bytes) {
    1.32 +  bool res;
    1.33 +  if (MemTracker::tracking_level() > NMT_minimal) {
    1.34 +    Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
    1.35 +    res = os::Linux::release_memory_special_impl(base, bytes);
    1.36 +    if (res) {
    1.37 +      tkr.record((address)base, bytes);
    1.38 +    }
    1.39 +
    1.40 +  } else {
    1.41 +    res = os::Linux::release_memory_special_impl(base, bytes);
    1.42 +  }
    1.43 +  return res;
    1.44 +}
    1.45 +
    1.46 +bool os::Linux::release_memory_special_impl(char* base, size_t bytes) {
    1.47    assert(UseLargePages, "only for large pages");
    1.48 -
    1.49 -  MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
    1.50 -
    1.51    bool res;
    1.52 +
    1.53    if (UseSHM) {
    1.54      res = os::Linux::release_memory_special_shm(base, bytes);
    1.55    } else {
    1.56      assert(UseHugeTLBFS, "must be");
    1.57      res = os::Linux::release_memory_special_huge_tlbfs(base, bytes);
    1.58    }
    1.59 -
    1.60 -  if (res) {
    1.61 -    tkr.record((address)base, bytes);
    1.62 -  } else {
    1.63 -    tkr.discard();
    1.64 -  }
    1.65 -
    1.66    return res;
    1.67  }
    1.68  

mercurial