257 } 258 if (diff_size != 0) { 259 // Use non-nmethod code heap for remaining space requirements 260 assert(!non_nmethod_set && ((intx)non_nmethod_size + diff_size) > 0, "sanity"); 261 non_nmethod_size += diff_size; 262 } 263 } 264 265 // We do not need the profiled CodeHeap, use all space for the non-profiled CodeHeap 266 if (!heap_available(CodeBlobType::MethodProfiled)) { 267 non_profiled_size += profiled_size; 268 profiled_size = 0; 269 } 270 // We do not need the non-profiled CodeHeap, use all space for the non-nmethod CodeHeap 271 if (!heap_available(CodeBlobType::MethodNonProfiled)) { 272 non_nmethod_size += non_profiled_size; 273 non_profiled_size = 0; 274 } 275 // Make sure we have enough space for VM internal code 276 uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3); 277 if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) { 278 vm_exit_during_initialization(err_msg( 279 "Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K", 280 non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K)); 281 } 282 283 // Verify sizes and update flag values 284 assert(non_profiled_size + profiled_size + non_nmethod_size == cache_size, "Invalid code heap sizes"); 285 FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, non_nmethod_size); 286 FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, profiled_size); 287 FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, non_profiled_size); 288 289 // If large page support is enabled, align code heaps according to large 290 // page size to make sure that code cache is covered by large pages. 291 const size_t alignment = MAX2(page_size(false), (size_t) os::vm_allocation_granularity()); 292 non_nmethod_size = align_up(non_nmethod_size, alignment); 293 profiled_size = align_down(profiled_size, alignment); 294 295 // Reserve one continuous chunk of memory for CodeHeaps and split it into 296 // parts for the individual heaps. The memory layout looks like this: 297 // ---------- high ----------- 298 // Non-profiled nmethods 299 // Profiled nmethods 300 // Non-nmethods | 257 } 258 if (diff_size != 0) { 259 // Use non-nmethod code heap for remaining space requirements 260 assert(!non_nmethod_set && ((intx)non_nmethod_size + diff_size) > 0, "sanity"); 261 non_nmethod_size += diff_size; 262 } 263 } 264 265 // We do not need the profiled CodeHeap, use all space for the non-profiled CodeHeap 266 if (!heap_available(CodeBlobType::MethodProfiled)) { 267 non_profiled_size += profiled_size; 268 profiled_size = 0; 269 } 270 // We do not need the non-profiled CodeHeap, use all space for the non-nmethod CodeHeap 271 if (!heap_available(CodeBlobType::MethodNonProfiled)) { 272 non_nmethod_size += non_profiled_size; 273 non_profiled_size = 0; 274 } 275 // Make sure we have enough space for VM internal code 276 uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3); 277 if (non_nmethod_size < min_code_cache_size) { 278 vm_exit_during_initialization(err_msg( 279 "Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K", 280 non_nmethod_size/K, min_code_cache_size/K)); 281 } 282 283 // Verify sizes and update flag values 284 assert(non_profiled_size + profiled_size + non_nmethod_size == cache_size, "Invalid code heap sizes"); 285 FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, non_nmethod_size); 286 FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, profiled_size); 287 FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, non_profiled_size); 288 289 // If large page support is enabled, align code heaps according to large 290 // page size to make sure that code cache is covered by large pages. 291 const size_t alignment = MAX2(page_size(false), (size_t) os::vm_allocation_granularity()); 292 non_nmethod_size = align_up(non_nmethod_size, alignment); 293 profiled_size = align_down(profiled_size, alignment); 294 295 // Reserve one continuous chunk of memory for CodeHeaps and split it into 296 // parts for the individual heaps. The memory layout looks like this: 297 // ---------- high ----------- 298 // Non-profiled nmethods 299 // Profiled nmethods 300 // Non-nmethods |