hotspot/src/share/vm/compiler/compileBroker.cpp
changeset 4750 71fd601907dc
parent 4560 b6f7db60cb24
child 4756 da88c27a9241
equal deleted inserted replaced
4749:f26b30116e3a 4750:71fd601907dc
    67 
    67 
    68 #endif // ndef DTRACE_ENABLED
    68 #endif // ndef DTRACE_ENABLED
    69 
    69 
    70 bool CompileBroker::_initialized = false;
    70 bool CompileBroker::_initialized = false;
    71 volatile bool CompileBroker::_should_block = false;
    71 volatile bool CompileBroker::_should_block = false;
       
    72 volatile jint CompileBroker::_should_compile_new_jobs = run_compilation;
    72 
    73 
    73 // The installed compiler(s)
    74 // The installed compiler(s)
    74 AbstractCompiler* CompileBroker::_compilers[2];
    75 AbstractCompiler* CompileBroker::_compilers[2];
    75 
    76 
    76 // These counters are used for assigning id's to each compilation
    77 // These counters are used for assigning id's to each compilation
   984 #endif // TIERED
   985 #endif // TIERED
   985       ) {
   986       ) {
   986       return method_code;
   987       return method_code;
   987     }
   988     }
   988     if (method->is_not_compilable(comp_level)) return NULL;
   989     if (method->is_not_compilable(comp_level)) return NULL;
       
   990 
       
   991     nmethod* saved = CodeCache::find_and_remove_saved_code(method());
       
   992     if (saved != NULL) {
       
   993       method->set_code(method, saved);
       
   994       return saved;
       
   995     }
       
   996 
   989   } else {
   997   } else {
   990     // osr compilation
   998     // osr compilation
   991 #ifndef TIERED
   999 #ifndef TIERED
   992     // seems like an assert of dubious value
  1000     // seems like an assert of dubious value
   993     assert(comp_level == CompLevel_full_optimization,
  1001     assert(comp_level == CompLevel_full_optimization,
  1033 
  1041 
  1034   // JVMTI -- post_compile_event requires jmethod_id() that may require
  1042   // JVMTI -- post_compile_event requires jmethod_id() that may require
  1035   // a lock the compiling thread can not acquire. Prefetch it here.
  1043   // a lock the compiling thread can not acquire. Prefetch it here.
  1036   if (JvmtiExport::should_post_compiled_method_load()) {
  1044   if (JvmtiExport::should_post_compiled_method_load()) {
  1037     method->jmethod_id();
  1045     method->jmethod_id();
       
  1046   }
       
  1047 
       
  1048   // If the compiler is shut off due to code cache flushing or otherwise,
       
  1049   // fail out now so blocking compiles dont hang the java thread
       
  1050   if (!should_compile_new_jobs() || (UseCodeCacheFlushing && CodeCache::needs_flushing())) {
       
  1051     method->invocation_counter()->decay();
       
  1052     method->backedge_counter()->decay();
       
  1053     return NULL;
  1038   }
  1054   }
  1039 
  1055 
  1040   // do the compilation
  1056   // do the compilation
  1041   if (method->is_native()) {
  1057   if (method->is_native()) {
  1042     if (!PreferInterpreterNativeStubs) {
  1058     if (!PreferInterpreterNativeStubs) {
  1323 
  1339 
  1324   while (true) {
  1340   while (true) {
  1325     {
  1341     {
  1326       // We need this HandleMark to avoid leaking VM handles.
  1342       // We need this HandleMark to avoid leaking VM handles.
  1327       HandleMark hm(thread);
  1343       HandleMark hm(thread);
       
  1344 
  1328       if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
  1345       if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
  1329         // The CodeCache is full.  Print out warning and disable compilation.
  1346         // the code cache is really full
  1330         UseInterpreter = true;
  1347         handle_full_code_cache();
  1331         if (UseCompiler || AlwaysCompileLoopMethods ) {
  1348       } else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
  1332           if (log != NULL) {
  1349         // Attempt to start cleaning the code cache while there is still a little headroom
  1333             log->begin_elem("code_cache_full");
  1350         NMethodSweeper::handle_full_code_cache(false);
  1334             log->stamp();
       
  1335             log->end_elem();
       
  1336           }
       
  1337 #ifndef PRODUCT
       
  1338           warning("CodeCache is full. Compiler has been disabled");
       
  1339           if (CompileTheWorld || ExitOnFullCodeCache) {
       
  1340             before_exit(thread);
       
  1341             exit_globals(); // will delete tty
       
  1342             vm_direct_exit(CompileTheWorld ? 0 : 1);
       
  1343           }
       
  1344 #endif
       
  1345           UseCompiler               = false;
       
  1346           AlwaysCompileLoopMethods  = false;
       
  1347         }
       
  1348       }
  1351       }
  1349 
  1352 
  1350       CompileTask* task = queue->get();
  1353       CompileTask* task = queue->get();
  1351 
  1354 
  1352       // Give compiler threads an extra quanta.  They tend to be bursty and
  1355       // Give compiler threads an extra quanta.  They tend to be bursty and
  1367                      (methodOop)JNIHandles::resolve(task->method_handle()));
  1370                      (methodOop)JNIHandles::resolve(task->method_handle()));
  1368 
  1371 
  1369       // Never compile a method if breakpoints are present in it
  1372       // Never compile a method if breakpoints are present in it
  1370       if (method()->number_of_breakpoints() == 0) {
  1373       if (method()->number_of_breakpoints() == 0) {
  1371         // Compile the method.
  1374         // Compile the method.
  1372         if (UseCompiler || AlwaysCompileLoopMethods) {
  1375         if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
  1373 #ifdef COMPILER1
  1376 #ifdef COMPILER1
  1374           // Allow repeating compilations for the purpose of benchmarking
  1377           // Allow repeating compilations for the purpose of benchmarking
  1375           // compile speed. This is not useful for customers.
  1378           // compile speed. This is not useful for customers.
  1376           if (CompilationRepeat != 0) {
  1379           if (CompilationRepeat != 0) {
  1377             int compile_count = CompilationRepeat;
  1380             int compile_count = CompilationRepeat;
  1612 #endif
  1615 #endif
  1613 }
  1616 }
  1614 
  1617 
  1615 
  1618 
  1616 // ------------------------------------------------------------------
  1619 // ------------------------------------------------------------------
       
  1620 // CompileBroker::handle_full_code_cache
       
  1621 //
       
  1622 // The CodeCache is full.  Print out warning and disable compilation or
       
  1623 // try code cache cleaning so compilation can continue later.
       
  1624 void CompileBroker::handle_full_code_cache() {
       
  1625   UseInterpreter = true;
       
  1626   if (UseCompiler || AlwaysCompileLoopMethods ) {
       
  1627     CompilerThread* thread = CompilerThread::current();
       
  1628     CompileLog* log = thread->log();
       
  1629     if (log != NULL) {
       
  1630       log->begin_elem("code_cache_full");
       
  1631       log->stamp();
       
  1632       log->end_elem();
       
  1633     }
       
  1634   #ifndef PRODUCT
       
  1635     warning("CodeCache is full. Compiler has been disabled");
       
  1636     if (CompileTheWorld || ExitOnFullCodeCache) {
       
  1637       before_exit(JavaThread::current());
       
  1638       exit_globals(); // will delete tty
       
  1639       vm_direct_exit(CompileTheWorld ? 0 : 1);
       
  1640     }
       
  1641   #endif
       
  1642     if (UseCodeCacheFlushing) {
       
  1643       NMethodSweeper::handle_full_code_cache(true);
       
  1644     } else {
       
  1645       UseCompiler               = false;
       
  1646       AlwaysCompileLoopMethods  = false;
       
  1647     }
       
  1648   }
       
  1649 }
       
  1650 
       
  1651 // ------------------------------------------------------------------
  1617 // CompileBroker::set_last_compile
  1652 // CompileBroker::set_last_compile
  1618 //
  1653 //
  1619 // Record this compilation for debugging purposes.
  1654 // Record this compilation for debugging purposes.
  1620 void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
  1655 void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
  1621   ResourceMark rm;
  1656   ResourceMark rm;