< prev index next >

src/hotspot/share/code/codeCache.cpp

Print this page




 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;


< prev index next >