@@ -200,8 +200,9 @@ void CodeCache::initialize_heaps() {
200200 bool non_nmethod_set = FLAG_IS_CMDLINE (NonNMethodCodeHeapSize);
201201 bool profiled_set = FLAG_IS_CMDLINE (ProfiledCodeHeapSize);
202202 bool non_profiled_set = FLAG_IS_CMDLINE (NonProfiledCodeHeapSize);
203- size_t min_size = os::vm_page_size ();
204- size_t cache_size = ReservedCodeCacheSize;
203+ const size_t ps = page_size (false , 8 );
204+ const size_t min_size = MAX2 (os::vm_allocation_granularity (), ps);
205+ const size_t cache_size = ReservedCodeCacheSize;
205206 size_t non_nmethod_size = NonNMethodCodeHeapSize;
206207 size_t profiled_size = ProfiledCodeHeapSize;
207208 size_t non_profiled_size = NonProfiledCodeHeapSize;
@@ -232,16 +233,18 @@ void CodeCache::initialize_heaps() {
232233 }
233234 // Calculate default CodeHeap sizes if not set by user
234235 if (!non_nmethod_set && !profiled_set && !non_profiled_set) {
236+ // Leave room for the other two parts of the code cache
237+ const size_t max_non_nmethod_size = cache_size - 2 * min_size;
235238 // Check if we have enough space for the non-nmethod code heap
236- if (cache_size > non_nmethod_size) {
239+ if (max_non_nmethod_size >= non_nmethod_size) {
237240 // Use the default value for non_nmethod_size and one half of the
238241 // remaining size for non-profiled and one half for profiled methods
239242 size_t remaining_size = cache_size - non_nmethod_size;
240243 profiled_size = remaining_size / 2 ;
241244 non_profiled_size = remaining_size - profiled_size;
242245 } else {
243246 // Use all space for the non-nmethod heap and set other heaps to minimal size
244- non_nmethod_size = cache_size - 2 * min_size ;
247+ non_nmethod_size = max_non_nmethod_size ;
245248 profiled_size = min_size;
246249 non_profiled_size = min_size;
247250 }
@@ -310,7 +313,6 @@ void CodeCache::initialize_heaps() {
310313 FLAG_SET_ERGO (ProfiledCodeHeapSize, profiled_size);
311314 FLAG_SET_ERGO (NonProfiledCodeHeapSize, non_profiled_size);
312315
313- const size_t ps = page_size (false , 8 );
314316 // Print warning if using large pages but not able to use the size given
315317 if (UseLargePages) {
316318 const size_t lg_ps = page_size (false , 1 );
@@ -321,12 +323,11 @@ void CodeCache::initialize_heaps() {
321323 }
322324 }
323325
324- // If large page support is enabled, align code heaps according to large
325- // page size to make sure that code cache is covered by large pages.
326- const size_t alignment = MAX2 (ps, os::vm_allocation_granularity ());
327- non_nmethod_size = align_up (non_nmethod_size, alignment);
328- profiled_size = align_down (profiled_size, alignment);
329- non_profiled_size = align_down (non_profiled_size, alignment);
326+ // Note: if large page support is enabled, min_size is at least the large
327+ // page size. This ensures that the code cache is covered by large pages.
328+ non_nmethod_size = align_up (non_nmethod_size, min_size);
329+ profiled_size = align_down (profiled_size, min_size);
330+ non_profiled_size = align_down (non_profiled_size, min_size);
330331
331332 // Reserve one continuous chunk of memory for CodeHeaps and split it into
332333 // parts for the individual heaps. The memory layout looks like this:
0 commit comments