242 non_profiled_size = min_size;
243 } else {
244 non_profiled_size += diff_size;
245 diff_size = 0;
246 }
247 } else if (non_nmethod_set) {
248 // Distribute remaining size between profiled and non-profiled code heaps
249 diff_size = cache_size - non_nmethod_size;
250 profiled_size = diff_size / 2;
251 non_profiled_size = diff_size - profiled_size;
252 diff_size = 0;
253 }
254 if (diff_size != 0) {
255 // Use non-nmethod code heap for remaining space requirements
256 assert(!non_nmethod_set && ((intx)non_nmethod_size + diff_size) > 0, "sanity");
257 non_nmethod_size += diff_size;
258 }
259 }
260
261 // We do not need the profiled CodeHeap, use all space for the non-profiled CodeHeap
262 if(!heap_available(CodeBlobType::MethodProfiled)) {
263 non_profiled_size += profiled_size;
264 profiled_size = 0;
265 }
266 // We do not need the non-profiled CodeHeap, use all space for the non-nmethod CodeHeap
267 if(!heap_available(CodeBlobType::MethodNonProfiled)) {
268 non_nmethod_size += non_profiled_size;
269 non_profiled_size = 0;
270 }
271 // Make sure we have enough space for VM internal code
272 uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3);
273 if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) {
274 vm_exit_during_initialization(err_msg(
275 "Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K",
276 non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K));
277 }
278
279 // Verify sizes and update flag values
280 assert(non_profiled_size + profiled_size + non_nmethod_size == cache_size, "Invalid code heap sizes");
281 FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, non_nmethod_size);
282 FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, profiled_size);
283 FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, non_profiled_size);
284
285 // Align CodeHeaps
286 size_t alignment = heap_alignment();
287 non_nmethod_size = align_up(non_nmethod_size, alignment);
398 }
399 if (code_blob_type_accepts_allocable(type)) {
400 _allocable_heaps->insert_sorted<code_heap_compare>(heap);
401 }
402 }
403
404 void CodeCache::add_heap(ReservedSpace rs, const char* name, int code_blob_type) {
405 // Check if heap is needed
406 if (!heap_available(code_blob_type)) {
407 return;
408 }
409
410 // Create CodeHeap
411 CodeHeap* heap = new CodeHeap(name, code_blob_type);
412 add_heap(heap);
413
414 // Reserve Space
415 size_t size_initial = MIN2(InitialCodeCacheSize, rs.size());
416 size_initial = align_up(size_initial, os::vm_page_size());
417 if (!heap->reserve(rs, size_initial, CodeCacheSegmentSize)) {
418 vm_exit_during_initialization("Could not reserve enough space for code cache");
419 }
420
421 // Register the CodeHeap
422 MemoryService::add_code_heap_memory_pool(heap, name);
423 }
424
425 CodeHeap* CodeCache::get_code_heap_containing(void* start) {
426 FOR_ALL_HEAPS(heap) {
427 if ((*heap)->contains(start)) {
428 return *heap;
429 }
430 }
431 return NULL;
432 }
433
434 CodeHeap* CodeCache::get_code_heap(const CodeBlob* cb) {
435 assert(cb != NULL, "CodeBlob is null");
436 FOR_ALL_HEAPS(heap) {
437 if ((*heap)->contains_blob(cb)) {
438 return *heap;
|
242 non_profiled_size = min_size;
243 } else {
244 non_profiled_size += diff_size;
245 diff_size = 0;
246 }
247 } else if (non_nmethod_set) {
248 // Distribute remaining size between profiled and non-profiled code heaps
249 diff_size = cache_size - non_nmethod_size;
250 profiled_size = diff_size / 2;
251 non_profiled_size = diff_size - profiled_size;
252 diff_size = 0;
253 }
254 if (diff_size != 0) {
255 // Use non-nmethod code heap for remaining space requirements
256 assert(!non_nmethod_set && ((intx)non_nmethod_size + diff_size) > 0, "sanity");
257 non_nmethod_size += diff_size;
258 }
259 }
260
261 // We do not need the profiled CodeHeap, use all space for the non-profiled CodeHeap
262 if (!heap_available(CodeBlobType::MethodProfiled)) {
263 non_profiled_size += profiled_size;
264 profiled_size = 0;
265 }
266 // We do not need the non-profiled CodeHeap, use all space for the non-nmethod CodeHeap
267 if (!heap_available(CodeBlobType::MethodNonProfiled)) {
268 non_nmethod_size += non_profiled_size;
269 non_profiled_size = 0;
270 }
271 // Make sure we have enough space for VM internal code
272 uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3);
273 if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) {
274 vm_exit_during_initialization(err_msg(
275 "Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K",
276 non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K));
277 }
278
279 // Verify sizes and update flag values
280 assert(non_profiled_size + profiled_size + non_nmethod_size == cache_size, "Invalid code heap sizes");
281 FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, non_nmethod_size);
282 FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, profiled_size);
283 FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, non_profiled_size);
284
285 // Align CodeHeaps
286 size_t alignment = heap_alignment();
287 non_nmethod_size = align_up(non_nmethod_size, alignment);
398 }
399 if (code_blob_type_accepts_allocable(type)) {
400 _allocable_heaps->insert_sorted<code_heap_compare>(heap);
401 }
402 }
403
404 void CodeCache::add_heap(ReservedSpace rs, const char* name, int code_blob_type) {
405 // Check if heap is needed
406 if (!heap_available(code_blob_type)) {
407 return;
408 }
409
410 // Create CodeHeap
411 CodeHeap* heap = new CodeHeap(name, code_blob_type);
412 add_heap(heap);
413
414 // Reserve Space
415 size_t size_initial = MIN2(InitialCodeCacheSize, rs.size());
416 size_initial = align_up(size_initial, os::vm_page_size());
417 if (!heap->reserve(rs, size_initial, CodeCacheSegmentSize)) {
418 vm_exit_during_initialization(err_msg("Could not reserve enough space in %s", heap->name()));
419 }
420
421 // Register the CodeHeap
422 MemoryService::add_code_heap_memory_pool(heap, name);
423 }
424
425 CodeHeap* CodeCache::get_code_heap_containing(void* start) {
426 FOR_ALL_HEAPS(heap) {
427 if ((*heap)->contains(start)) {
428 return *heap;
429 }
430 }
431 return NULL;
432 }
433
434 CodeHeap* CodeCache::get_code_heap(const CodeBlob* cb) {
435 assert(cb != NULL, "CodeBlob is null");
436 FOR_ALL_HEAPS(heap) {
437 if ((*heap)->contains_blob(cb)) {
438 return *heap;
|