1.1 --- a/src/os/windows/vm/os_windows.cpp Wed Aug 27 09:36:55 2014 +0200 1.2 +++ b/src/os/windows/vm/os_windows.cpp Wed Aug 27 08:19:12 2014 -0400 1.3 @@ -131,6 +131,12 @@ 1.4 case DLL_PROCESS_DETACH: 1.5 if(ForceTimeHighResolution) 1.6 timeEndPeriod(1L); 1.7 + 1.8 + // Workaround for issue when a custom launcher doesn't call 1.9 + // DestroyJavaVM and NMT is trying to track memory when free is 1.10 + // called from a static destructor 1.11 + MemTracker::shutdown(); 1.12 + 1.13 break; 1.14 default: 1.15 break; 1.16 @@ -153,6 +159,10 @@ 1.17 return result > 0 && result < len; 1.18 } 1.19 1.20 +bool os::unsetenv(const char* name) { 1.21 + assert(name != NULL, "Null pointer"); 1.22 + return (SetEnvironmentVariable(name, NULL) == TRUE); 1.23 +} 1.24 1.25 // No setuid programs under Windows. 1.26 bool os::have_special_privileges() { 1.27 @@ -311,15 +321,17 @@ 1.28 * So far, this method is only used by Native Memory Tracking, which is 1.29 * only supported on Windows XP or later. 1.30 */ 1.31 -address os::get_caller_pc(int n) { 1.32 + 1.33 +int os::get_native_stack(address* stack, int frames, int toSkip) { 1.34 #ifdef _NMT_NOINLINE_ 1.35 - n ++; 1.36 + toSkip ++; 1.37 #endif 1.38 - address pc; 1.39 - if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) { 1.40 - return pc; 1.41 - } 1.42 - return NULL; 1.43 + int captured = Kernel32Dll::RtlCaptureStackBackTrace(toSkip + 1, frames, 1.44 + (PVOID*)stack, NULL); 1.45 + for (int index = captured; index < frames; index ++) { 1.46 + stack[index] = NULL; 1.47 + } 1.48 + return captured; 1.49 } 1.50 1.51 1.52 @@ -2904,7 +2916,7 @@ 1.53 PAGE_READWRITE); 1.54 // If reservation failed, return NULL 1.55 if (p_buf == NULL) return NULL; 1.56 - MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, mtNone, CALLER_PC); 1.57 + MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC); 1.58 os::release_memory(p_buf, bytes + chunk_size); 1.59 1.60 // we still need to round up to a page boundary (in case we are using large pages) 1.61 @@ -2970,7 +2982,7 @@ 1.62 // need to create a dummy 'reserve' record to match 1.63 // the release. 1.64 MemTracker::record_virtual_memory_reserve((address)p_buf, 1.65 - bytes_to_release, mtNone, CALLER_PC); 1.66 + bytes_to_release, CALLER_PC); 1.67 os::release_memory(p_buf, bytes_to_release); 1.68 } 1.69 #ifdef ASSERT 1.70 @@ -2989,11 +3001,10 @@ 1.71 } 1.72 // Although the memory is allocated individually, it is returned as one. 1.73 // NMT records it as one block. 1.74 - address pc = CALLER_PC; 1.75 if ((flags & MEM_COMMIT) != 0) { 1.76 - MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, mtNone, pc); 1.77 + MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, CALLER_PC); 1.78 } else { 1.79 - MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, mtNone, pc); 1.80 + MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, CALLER_PC); 1.81 } 1.82 1.83 // made it this far, success 1.84 @@ -3191,8 +3202,7 @@ 1.85 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 1.86 char * res = (char *)VirtualAlloc(addr, bytes, flag, prot); 1.87 if (res != NULL) { 1.88 - address pc = CALLER_PC; 1.89 - MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, mtNone, pc); 1.90 + MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, CALLER_PC); 1.91 } 1.92 1.93 return res;