src/share/vm/code/codeCache.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File JDK-7194669 Cdiff src/share/vm/code/codeCache.cpp

src/share/vm/code/codeCache.cpp

Print this page

        

*** 594,650 **** nm->clear_inline_caches(); } } #ifndef PRODUCT ! // used to keep track of how much time is spent in mark_for_deoptimization static elapsedTimer dependentCheckTime; ! static int dependentCheckCount = 0; ! #endif // PRODUCT int CodeCache::mark_for_deoptimization(DepChange& changes) { MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - - #ifndef PRODUCT - dependentCheckTime.start(); - dependentCheckCount++; - #endif // PRODUCT - int number_of_marked_CodeBlobs = 0; // search the hierarchy looking for nmethods which are affected by the loading of this class // then search the interfaces this class implements looking for nmethods // which might be dependent of the fact that an interface only had one // implementor. ! ! { No_Safepoint_Verifier nsv; for (DepChange::ContextStream str(changes, nsv); str.next(); ) { Klass* d = str.klass(); number_of_marked_CodeBlobs += InstanceKlass::cast(d)->mark_dependent_nmethods(changes); } - } - - if (VerifyDependencies) { - // Turn off dependency tracing while actually testing deps. - NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) ); - FOR_ALL_ALIVE_NMETHODS(nm) { - if (!nm->is_marked_for_deoptimization() && - nm->check_all_dependencies()) { - ResourceMark rm; - tty->print_cr("Should have been marked for deoptimization:"); - changes.print(); - nm->print(); - nm->print_dependencies(); - } - } - } #ifndef PRODUCT dependentCheckTime.stop(); ! #endif // PRODUCT return number_of_marked_CodeBlobs; } --- 594,634 ---- nm->clear_inline_caches(); } } #ifndef PRODUCT ! // Keeps track of time spent for checking dependencies static elapsedTimer dependentCheckTime; ! #endif int CodeCache::mark_for_deoptimization(DepChange& changes) { MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); int number_of_marked_CodeBlobs = 0; // search the hierarchy looking for nmethods which are affected by the loading of this class // then search the interfaces this class implements looking for nmethods // which might be dependent of the fact that an interface only had one // implementor. ! // nmethod::check_all_dependencies works only correctly, if no safepoint ! // can happen ! No_Safepoint_Verifier nsv; for (DepChange::ContextStream str(changes, nsv); str.next(); ) { Klass* d = str.klass(); number_of_marked_CodeBlobs += InstanceKlass::cast(d)->mark_dependent_nmethods(changes); } #ifndef PRODUCT + if (VerifyDependencies) { + // Object pointers are used as unique identifiers for dependency arguments. This + // is only possible if no safepoint, i.e., GC occurs during the verification code. + dependentCheckTime.start(); + nmethod::check_all_dependencies(changes); dependentCheckTime.stop(); ! } ! #endif return number_of_marked_CodeBlobs; }
*** 897,909 **** live.add(p); } } tty->print_cr("CodeCache:"); ! ! tty->print_cr("nmethod dependency checking time %f", dependentCheckTime.seconds(), ! dependentCheckTime.seconds() / dependentCheckCount); if (!live.is_empty()) { live.print("live"); } if (!dead.is_empty()) { --- 881,891 ---- live.add(p); } } tty->print_cr("CodeCache:"); ! tty->print_cr("nmethod dependency checking time %fs", dependentCheckTime.seconds()); if (!live.is_empty()) { live.print("live"); } if (!dead.is_empty()) {
src/share/vm/code/codeCache.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File