diff a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1755,14 +1755,13 @@ guarantee(unload_nmethod_caches(unloading_occurred), "Should not need transition stubs"); } } -void nmethod::oops_do(OopClosure* f, bool allow_zombie) { +void nmethod::oops_do(OopClosure* f, bool allow_dead) { // make sure the oops ready to receive visitors - assert(allow_zombie || !is_zombie(), "should not call follow on zombie nmethod"); - assert(!is_unloaded(), "should not call follow on unloaded nmethod"); + assert(allow_dead || is_alive(), "should not call follow on dead nmethod"); // Prevent extra code cache walk for platforms that don't have immediate oops. if (relocInfo::mustIterateImmediateOopsInCode()) { RelocIterator iter(this, oops_reloc_begin()); diff a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -473,11 +473,11 @@ } #endif public: void oops_do(OopClosure* f) { oops_do(f, false); } - void oops_do(OopClosure* f, bool allow_zombie); + void oops_do(OopClosure* f, bool allow_dead); bool test_set_oops_do_mark(); static void oops_do_marking_prologue(); static void oops_do_marking_epilogue(); static bool oops_do_marking_is_active() { return _oops_do_mark_nmethods != NULL; } diff a/src/hotspot/share/gc/shared/gcBehaviours.cpp b/src/hotspot/share/gc/shared/gcBehaviours.cpp --- a/src/hotspot/share/gc/shared/gcBehaviours.cpp +++ b/src/hotspot/share/gc/shared/gcBehaviours.cpp @@ -62,11 +62,11 @@ }; bool ClosureIsUnloadingBehaviour::is_unloading(CompiledMethod* cm) const { if (cm->is_nmethod()) { IsCompiledMethodUnloadingOopClosure cl(_cl); - static_cast(cm)->oops_do(&cl); + static_cast(cm)->oops_do(&cl, true /* allow_dead */); return cl.is_unloading(); } else { return false; } }