< prev index next >

src/hotspot/os/windows/os_windows.cpp

Print this page




2875   if (success && _large_page_size > default_page_size) {
2876     _page_sizes[0] = _large_page_size;
2877     _page_sizes[1] = default_page_size;
2878     _page_sizes[2] = 0;
2879   }
2880 
2881   cleanup_after_large_page_init();
2882   UseLargePages = success;
2883 }
2884 
2885 int os::create_file_for_heap(const char* dir) {
2886 
2887   const char name_template[] = "/jvmheap.XXXXXX";
2888   char *fullname = (char*)os::malloc((strlen(dir) + strlen(name_template) + 1), mtInternal);
2889   if (fullname == NULL) {
2890     vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno)));
2891     return -1;
2892   }
2893 
2894   (void)strncpy(fullname, dir, strlen(dir)+1);
2895   (void)strncat(fullname, name_template, strlen(name_template);
2896 
2897   os::native_path(fullname);
2898 
2899   char *path = _mktemp(fullname);
2900   if (path == NULL) {
2901     warning("_mktemp could not create file name from template (%s)", os::strerror(errno));
2902     os::free(fullname);
2903     return -1;
2904   }
2905 
2906   int fd = _open(path, O_RDWR | O_CREAT | O_TEMPORARY | O_EXCL, S_IWRITE | S_IREAD);
2907 
2908   os::free(fullname);
2909   if (fd < 0) {
2910         warning("Problem opening file for heap (%s)", os::strerror(errno));
2911     return -1;
2912   }
2913   return fd;
2914 }
2915 
2916 // If 'base' is not NULL, function will return NULL if it cannot get 'base'
2917 char* os::map_memory_to_dax_file(char* base, size_t size, int fd) {
2918   assert(fd != -1, "File descriptor is not valid");
2919 
2920   HANDLE fh = (HANDLE)_get_osfhandle(fd);
2921   HANDLE fileMapping = CreateFileMapping(fh, NULL, PAGE_READWRITE,


2929     }
2930 
2931     return NULL;
2932   }
2933 
2934   LPVOID addr = MapViewOfFileEx(fileMapping, FILE_MAP_WRITE, 0, 0, size, base);
2935 
2936   CloseHandle(fileMapping);
2937 
2938   return (char*)addr;
2939 }
2940 
2941 char* os::replace_existing_mapping_with_dax_file_mapping(char* base, size_t size, int fd) {
2942   assert(fd != -1, "File descriptor is not valid");
2943   assert(base != NULL, "Base address cannot be NULL");
2944 
2945   release_memory(base, size);
2946   return map_memory_to_dax_file(base, size, fd);
2947 }
2948 
2949 char* os::attempt_reserve_memory_at(size_t bytes, char* addr, int file_desc) {
2950   char* result = NULL;
2951   if (file_desc != -1) {
2952     result = map_memory_to_dax_file(addr, bytes, file_desc);
2953     if (result != NULL) {
2954       MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
2955     }
2956   } else {
2957     result = pd_attempt_reserve_memory_at(bytes, addr);
2958     if (result != NULL) {
2959       MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
2960     }
2961   }
2962   return result;
2963 }
2964 
2965 // On win32, one cannot release just a part of reserved memory, it's an
2966 // all or nothing deal.  When we split a reservation, we must break the
2967 // reservation into two reservations.
2968 void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
2969                                   bool realloc) {
2970   if (size > 0) {
2971     release_memory(base, size);
2972     if (realloc) {
2973       reserve_memory(split, base);
2974     }
2975     if (size != split) {
2976       reserve_memory(size - split, base + split);
2977     }
2978   }
2979 }
2980 
2981 // Multiple threads can race in this code but it's not possible to unmap small sections of
2982 // virtual space to get requested alignment, like posix-like os's.
2983 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
2984 char* os::reserve_memory_aligned(size_t size, size_t alignment, int file_desc) {


3032       warning("NUMA page allocation failed");
3033     }
3034     if (Verbose && PrintMiscellaneous) {
3035       reserveTimer.stop();
3036       tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3037                     reserveTimer.milliseconds(), reserveTimer.ticks());
3038     }
3039   }
3040   assert(res == NULL || addr == NULL || addr == res,
3041          "Unexpected address from reserve.");
3042 
3043   return res;
3044 }
3045 
3046 // Reserve memory at an arbitrary address, only if that area is
3047 // available (and not reserved for something else).
3048 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3049   // Windows os::reserve_memory() fails of the requested address range is
3050   // not avilable.
3051   return reserve_memory(bytes, requested_addr);





3052 }
3053 
3054 size_t os::large_page_size() {
3055   return _large_page_size;
3056 }
3057 
3058 bool os::can_commit_large_page_memory() {
3059   // Windows only uses large page memory when the entire region is reserved
3060   // and committed in a single VirtualAlloc() call. This may change in the
3061   // future, but with Windows 2003 it's not possible to commit on demand.
3062   return false;
3063 }
3064 
3065 bool os::can_execute_large_page_memory() {
3066   return true;
3067 }
3068 
3069 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr,
3070                                  bool exec) {
3071   assert(UseLargePages, "only for large pages");




2875   if (success && _large_page_size > default_page_size) {
2876     _page_sizes[0] = _large_page_size;
2877     _page_sizes[1] = default_page_size;
2878     _page_sizes[2] = 0;
2879   }
2880 
2881   cleanup_after_large_page_init();
2882   UseLargePages = success;
2883 }
2884 
2885 int os::create_file_for_heap(const char* dir) {
2886 
2887   const char name_template[] = "/jvmheap.XXXXXX";
2888   char *fullname = (char*)os::malloc((strlen(dir) + strlen(name_template) + 1), mtInternal);
2889   if (fullname == NULL) {
2890     vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno)));
2891     return -1;
2892   }
2893 
2894   (void)strncpy(fullname, dir, strlen(dir)+1);
2895   (void)strncat(fullname, name_template, strlen(name_template));
2896 
2897   os::native_path(fullname);
2898 
2899   char *path = _mktemp(fullname);
2900   if (path == NULL) {
2901     warning("_mktemp could not create file name from template %s (%s)", fullname, os::strerror(errno));
2902     os::free(fullname);
2903     return -1;
2904   }
2905 
2906   int fd = _open(path, O_RDWR | O_CREAT | O_TEMPORARY | O_EXCL, S_IWRITE | S_IREAD);
2907 
2908   os::free(fullname);
2909   if (fd < 0) {
2910         warning("Problem opening file for heap (%s)", os::strerror(errno));
2911     return -1;
2912   }
2913   return fd;
2914 }
2915 
2916 // If 'base' is not NULL, function will return NULL if it cannot get 'base'
2917 char* os::map_memory_to_dax_file(char* base, size_t size, int fd) {
2918   assert(fd != -1, "File descriptor is not valid");
2919 
2920   HANDLE fh = (HANDLE)_get_osfhandle(fd);
2921   HANDLE fileMapping = CreateFileMapping(fh, NULL, PAGE_READWRITE,


2929     }
2930 
2931     return NULL;
2932   }
2933 
2934   LPVOID addr = MapViewOfFileEx(fileMapping, FILE_MAP_WRITE, 0, 0, size, base);
2935 
2936   CloseHandle(fileMapping);
2937 
2938   return (char*)addr;
2939 }
2940 
2941 char* os::replace_existing_mapping_with_dax_file_mapping(char* base, size_t size, int fd) {
2942   assert(fd != -1, "File descriptor is not valid");
2943   assert(base != NULL, "Base address cannot be NULL");
2944 
2945   release_memory(base, size);
2946   return map_memory_to_dax_file(base, size, fd);
2947 }
2948 
















2949 // On win32, one cannot release just a part of reserved memory, it's an
2950 // all or nothing deal.  When we split a reservation, we must break the
2951 // reservation into two reservations.
2952 void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
2953                                   bool realloc) {
2954   if (size > 0) {
2955     release_memory(base, size);
2956     if (realloc) {
2957       reserve_memory(split, base);
2958     }
2959     if (size != split) {
2960       reserve_memory(size - split, base + split);
2961     }
2962   }
2963 }
2964 
2965 // Multiple threads can race in this code but it's not possible to unmap small sections of
2966 // virtual space to get requested alignment, like posix-like os's.
2967 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
2968 char* os::reserve_memory_aligned(size_t size, size_t alignment, int file_desc) {


3016       warning("NUMA page allocation failed");
3017     }
3018     if (Verbose && PrintMiscellaneous) {
3019       reserveTimer.stop();
3020       tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3021                     reserveTimer.milliseconds(), reserveTimer.ticks());
3022     }
3023   }
3024   assert(res == NULL || addr == NULL || addr == res,
3025          "Unexpected address from reserve.");
3026 
3027   return res;
3028 }
3029 
3030 // Reserve memory at an arbitrary address, only if that area is
3031 // available (and not reserved for something else).
3032 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3033   // Windows os::reserve_memory() fails of the requested address range is
3034   // not avilable.
3035   return reserve_memory(bytes, requested_addr);
3036 }
3037 
3038 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int file_desc) {
3039   assert(file_desc >= 0, "file_desc is not valid");
3040   return map_memory_to_dax_file(requested_addr, bytes, file_desc);
3041 }
3042 
3043 size_t os::large_page_size() {
3044   return _large_page_size;
3045 }
3046 
3047 bool os::can_commit_large_page_memory() {
3048   // Windows only uses large page memory when the entire region is reserved
3049   // and committed in a single VirtualAlloc() call. This may change in the
3050   // future, but with Windows 2003 it's not possible to commit on demand.
3051   return false;
3052 }
3053 
3054 bool os::can_execute_large_page_memory() {
3055   return true;
3056 }
3057 
3058 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr,
3059                                  bool exec) {
3060   assert(UseLargePages, "only for large pages");


< prev index next >