diff -r 5bc1634bc0ca -r 739eaf4ac4ad src/hotspot/share/classfile/systemDictionary.cpp --- a/src/hotspot/share/classfile/systemDictionary.cpp Thu Jan 31 10:18:41 2019 -0500 +++ b/src/hotspot/share/classfile/systemDictionary.cpp Thu Jan 31 10:29:53 2019 -0500 @@ -1825,40 +1825,27 @@ if (unloading_occurred) { MutexLockerEx ml2(is_concurrent ? Module_lock : NULL); JFR_ONLY(Jfr::on_unloading_classes();) + MutexLockerEx ml1(is_concurrent ? SystemDictionary_lock : NULL); ClassLoaderDataGraph::clean_module_and_package_info(); - } - } - - // Cleanup ResolvedMethodTable even if no unloading occurred. - { - GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer); - ResolvedMethodTable::trigger_cleanup(); - } - - if (unloading_occurred) { - { - GCTraceTime(Debug, gc, phases) t("SymbolTable", gc_timer); - // Check if there's work to do in the SymbolTable - SymbolTable::do_check_concurrent_work(); - } - - { - MutexLockerEx ml(is_concurrent ? SystemDictionary_lock : NULL); - GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer); constraints()->purge_loader_constraints(); resolution_errors()->purge_resolution_errors(); } - - { - GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer); - // Oops referenced by the protection domain cache table may get unreachable independently - // of the class loader (eg. cached protection domain oops). So we need to - // explicitly unlink them here. - // All protection domain oops are linked to the caller class, so if nothing - // unloads, this is not needed. - _pd_cache_table->trigger_cleanup(); - } + } + + GCTraceTime(Debug, gc, phases) t("Trigger cleanups", gc_timer); + // Trigger cleaning the ResolvedMethodTable even if no unloading occurred. + ResolvedMethodTable::trigger_cleanup(); + + if (unloading_occurred) { + SymbolTable::trigger_cleanup(); + + // Oops referenced by the protection domain cache table may get unreachable independently + // of the class loader (eg. cached protection domain oops). So we need to + // explicitly unlink them here. + // All protection domain oops are linked to the caller class, so if nothing + // unloads, this is not needed. + _pd_cache_table->trigger_cleanup(); } return unloading_occurred;