--- old/src/share/vm/code/nmethod.cpp 2013-06-26 14:23:13.954536561 -0700 +++ new/src/share/vm/code/nmethod.cpp 2013-06-26 14:23:13.690650019 -0700 @@ -687,6 +687,7 @@ code_buffer->copy_values_to(this); if (ScavengeRootsInCode && detect_scavenge_root_oops()) { CodeCache::add_scavenge_root_nmethod(this); + Universe::heap()->register_nmethod(this); } debug_only(verify_scavenge_root_oops()); CodeCache::commit(this); @@ -881,6 +882,7 @@ dependencies->copy_to(this); if (ScavengeRootsInCode && detect_scavenge_root_oops()) { CodeCache::add_scavenge_root_nmethod(this); + Universe::heap()->register_nmethod(this); } debug_only(verify_scavenge_root_oops()); @@ -1337,6 +1339,12 @@ inc_decompile_count(); } + // If the state is becoming a zombie, unregister the nmethod with heap + // This nmethod may have already been unloaded during a full GC. + if ((state == zombie) && !is_unloaded()) { + Universe::heap()->unregister_nmethod(this); + } + // Change state _state = state;