--- old/src/share/vm/runtime/sweeper.cpp 2016-03-29 18:42:28.884731828 +0200 +++ new/src/share/vm/runtime/sweeper.cpp 2016-03-29 18:42:28.820731831 +0200 @@ -613,7 +613,10 @@ // Code cache state change is tracked in make_zombie() nm->make_zombie(); SWEEP(nm); - if (nm->is_osr_method()) { + // The nmethod may have been locked by JVMTI after being made zombie (see + // JvmtiDeferredEvent::compiled_method_unload_event()). If so, we cannot + // flush the osr nmethod directly but have to wait for a later sweeper cycle. + if (nm->is_osr_method() && !nm->is_locked_by_vm()) { // No inline caches will ever point to osr methods, so we can just remove it. // Make sure that we unregistered the nmethod with the heap and flushed all // dependencies before removing the nmethod (done in make_zombie()).