hotspot/src/os/windows/vm/os_windows.cpp
changeset 15927 f256c20146f4
parent 15733 5bd5dc5b9bb9
child 16669 fb3397cee116
child 16623 89050b0a21e3
child 16605 ba13efd453bc
equal deleted inserted replaced
15926:8e87d545195f 15927:f256c20146f4
    58 #include "runtime/stubRoutines.hpp"
    58 #include "runtime/stubRoutines.hpp"
    59 #include "runtime/thread.inline.hpp"
    59 #include "runtime/thread.inline.hpp"
    60 #include "runtime/threadCritical.hpp"
    60 #include "runtime/threadCritical.hpp"
    61 #include "runtime/timer.hpp"
    61 #include "runtime/timer.hpp"
    62 #include "services/attachListener.hpp"
    62 #include "services/attachListener.hpp"
       
    63 #include "services/memTracker.hpp"
    63 #include "services/runtimeService.hpp"
    64 #include "services/runtimeService.hpp"
    64 #include "utilities/decoder.hpp"
    65 #include "utilities/decoder.hpp"
    65 #include "utilities/defaultStream.hpp"
    66 #include "utilities/defaultStream.hpp"
    66 #include "utilities/events.hpp"
    67 #include "utilities/events.hpp"
    67 #include "utilities/growableArray.hpp"
    68 #include "utilities/growableArray.hpp"
  2834                                 size_of_reserve,  // size of Reserve
  2835                                 size_of_reserve,  // size of Reserve
  2835                                 MEM_RESERVE,
  2836                                 MEM_RESERVE,
  2836                                 PAGE_READWRITE);
  2837                                 PAGE_READWRITE);
  2837   // If reservation failed, return NULL
  2838   // If reservation failed, return NULL
  2838   if (p_buf == NULL) return NULL;
  2839   if (p_buf == NULL) return NULL;
  2839 
  2840   MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC);
  2840   os::release_memory(p_buf, bytes + chunk_size);
  2841   os::release_memory(p_buf, bytes + chunk_size);
  2841 
  2842 
  2842   // we still need to round up to a page boundary (in case we are using large pages)
  2843   // we still need to round up to a page boundary (in case we are using large pages)
  2843   // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
  2844   // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
  2844   // instead we handle this in the bytes_to_rq computation below
  2845   // instead we handle this in the bytes_to_rq computation below
  2896     if (p_new == NULL) {
  2897     if (p_new == NULL) {
  2897       // Free any allocated pages
  2898       // Free any allocated pages
  2898       if (next_alloc_addr > p_buf) {
  2899       if (next_alloc_addr > p_buf) {
  2899         // Some memory was committed so release it.
  2900         // Some memory was committed so release it.
  2900         size_t bytes_to_release = bytes - bytes_remaining;
  2901         size_t bytes_to_release = bytes - bytes_remaining;
       
  2902         // NMT has yet to record any individual blocks, so it
       
  2903         // need to create a dummy 'reserve' record to match
       
  2904         // the release.
       
  2905         MemTracker::record_virtual_memory_reserve((address)p_buf,
       
  2906           bytes_to_release, CALLER_PC);
  2901         os::release_memory(p_buf, bytes_to_release);
  2907         os::release_memory(p_buf, bytes_to_release);
  2902       }
  2908       }
  2903 #ifdef ASSERT
  2909 #ifdef ASSERT
  2904       if (should_inject_error) {
  2910       if (should_inject_error) {
  2905         if (TracePageSizes && Verbose) {
  2911         if (TracePageSizes && Verbose) {
  2907         }
  2913         }
  2908       }
  2914       }
  2909 #endif
  2915 #endif
  2910       return NULL;
  2916       return NULL;
  2911     }
  2917     }
       
  2918 
  2912     bytes_remaining -= bytes_to_rq;
  2919     bytes_remaining -= bytes_to_rq;
  2913     next_alloc_addr += bytes_to_rq;
  2920     next_alloc_addr += bytes_to_rq;
  2914     count++;
  2921     count++;
  2915   }
  2922   }
       
  2923   // Although the memory is allocated individually, it is returned as one.
       
  2924   // NMT records it as one block.
       
  2925   address pc = CALLER_PC;
       
  2926   MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, pc);
       
  2927   if ((flags & MEM_COMMIT) != 0) {
       
  2928     MemTracker::record_virtual_memory_commit((address)p_buf, bytes, pc);
       
  2929   }
       
  2930 
  2916   // made it this far, success
  2931   // made it this far, success
  2917   return p_buf;
  2932   return p_buf;
  2918 }
  2933 }
  2919 
  2934 
  2920 
  2935 
  3097 
  3112 
  3098   } else {
  3113   } else {
  3099     // normal policy just allocate it all at once
  3114     // normal policy just allocate it all at once
  3100     DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
  3115     DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
  3101     char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
  3116     char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
       
  3117     if (res != NULL) {
       
  3118       address pc = CALLER_PC;
       
  3119       MemTracker::record_virtual_memory_reserve((address)res, bytes, pc);
       
  3120       MemTracker::record_virtual_memory_commit((address)res, bytes, pc);
       
  3121     }
       
  3122 
  3102     return res;
  3123     return res;
  3103   }
  3124   }
  3104 }
  3125 }
  3105 
  3126 
  3106 bool os::release_memory_special(char* base, size_t bytes) {
  3127 bool os::release_memory_special(char* base, size_t bytes) {
       
  3128   assert(base != NULL, "Sanity check");
       
  3129   // Memory allocated via reserve_memory_special() is committed
       
  3130   MemTracker::record_virtual_memory_uncommit((address)base, bytes);
  3107   return release_memory(base, bytes);
  3131   return release_memory(base, bytes);
  3108 }
  3132 }
  3109 
  3133 
  3110 void os::print_statistics() {
  3134 void os::print_statistics() {
  3111 }
  3135 }