< prev index next >

src/hotspot/share/code/codeCache.cpp

Print this page
rev 54936 : [mq]: 8221734-v3
rev 54937 : [mq]: 8221734-v5

*** 1144,1168 **** Deoptimization::deoptimize_all_marked(); } #endif // INCLUDE_JVMTI ! // Deoptimize all(most) methods void CodeCache::mark_all_nmethods_for_deoptimization() { MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading); while(iter.next()) { CompiledMethod* nm = iter.method(); - // Not installed are unsafe to mark for deopt, normally never deopted. - // A not_entrant method may become a zombie at any time, - // since we don't know on which side of last safepoint it became not_entrant - // (state must be in_use). - // Native method are unsafe to mark for deopt, normally never deopted. if (!nm->method()->is_method_handle_intrinsic() && !nm->is_not_installed() && nm->is_in_use() && !nm->is_native_method()) { nm->mark_for_deoptimization(); } } } --- 1144,1168 ---- Deoptimization::deoptimize_all_marked(); } #endif // INCLUDE_JVMTI ! // Mark methods for deopt (if safe or possible). void CodeCache::mark_all_nmethods_for_deoptimization() { MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading); while(iter.next()) { CompiledMethod* nm = iter.method(); if (!nm->method()->is_method_handle_intrinsic() && !nm->is_not_installed() && nm->is_in_use() && !nm->is_native_method()) { + // Intrinsics and native methods are never deopted. A method that is + // not installed yet or is not in use is not safe to deopt; the + // is_in_use() check covers the not_entrant and not zombie cases. + // Note: A not_entrant method can become a zombie at anytime if it was + // made not_entrant before the previous safepoint/handshake. nm->mark_for_deoptimization(); } } }
*** 1186,1201 **** void CodeCache::make_marked_nmethods_not_entrant() { assert_locked_or_safepoint(CodeCache_lock); CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading); while(iter.next()) { CompiledMethod* nm = iter.method(); - // only_alive_and_not_unloading returns not_entrant nmethods. - // A not_entrant can become a zombie at anytime, - // if it was made not_entrant before previous safepoint/handshake. - // We check that it is not not_entrant and not zombie, - // by checking is_in_use(). if (nm->is_marked_for_deoptimization() && nm->is_in_use()) { nm->make_not_entrant(); } } } --- 1186,1201 ---- void CodeCache::make_marked_nmethods_not_entrant() { assert_locked_or_safepoint(CodeCache_lock); CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading); while(iter.next()) { CompiledMethod* nm = iter.method(); if (nm->is_marked_for_deoptimization() && nm->is_in_use()) { + // only_alive_and_not_unloading() can return not_entrant nmethods. + // A not_entrant method can become a zombie at anytime if it was + // made not_entrant before the previous safepoint/handshake. The + // is_in_use() check covers the not_entrant and not zombie cases + // that have become true after the method was marked for deopt. nm->make_not_entrant(); } } }
< prev index next >