src/share/vm/code/nmethod.cpp
Print this page
rev 4802 : imported patch optimize-nmethod-scanning
*** 685,694 ****
--- 685,695 ----
_pc_desc_cache.reset_to(NULL);
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);
}
*** 879,888 ****
--- 880,890 ----
code_buffer->copy_values_to(this);
debug_info->copy_to(this);
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());
CodeCache::commit(this);
*** 1335,1344 ****
--- 1337,1352 ----
// It's a true state change, so mark the method as decompiled.
// Do it only for transition from alive.
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;
// Log the transition once
log_state_change();