diff -r 7e78be444e68 -r 32161fbea3fe src/hotspot/share/oops/instanceKlass.cpp --- a/src/hotspot/share/oops/instanceKlass.cpp Tue Sep 25 21:33:51 2018 -0700 +++ b/src/hotspot/share/oops/instanceKlass.cpp Wed Sep 26 14:01:48 2018 -0400 @@ -2417,7 +2417,10 @@ } #endif -void InstanceKlass::notify_unload_class(InstanceKlass* ik) { +void InstanceKlass::unload_class(InstanceKlass* ik) { + // Release dependencies. + ik->dependencies().remove_all_dependents(); + // notify the debugger if (JvmtiExport::should_post_class_unload()) { JvmtiExport::post_class_unload(ik); @@ -2462,16 +2465,8 @@ FreeHeap(jmeths); } - // Release dependencies. - // It is desirable to use DC::remove_all_dependents() here, but, unfortunately, - // it is not safe (see JDK-8143408). The problem is that the klass dependency - // context can contain live dependencies, since there's a race between nmethod & - // klass unloading. If the klass is dead when nmethod unloading happens, relevant - // dependencies aren't removed from the context associated with the class (see - // nmethod::flush_dependencies). It ends up during klass unloading as seemingly - // live dependencies pointing to unloaded nmethods and causes a crash in - // DC::remove_all_dependents() when it touches unloaded nmethod. - dependencies().wipe(); + assert(_dep_context == DependencyContext::EMPTY, + "dependencies should already be cleaned"); #if INCLUDE_JVMTI // Deallocate breakpoint records