< prev index next >
src/hotspot/share/classfile/systemDictionary.cpp
Print this page
*** 1853,1899 ****
// Note: anonymous classes are not in the SD.
bool SystemDictionary::do_unloading(GCTimer* gc_timer,
bool do_cleaning) {
bool unloading_occurred;
{
GCTraceTime(Debug, gc, phases) t("ClassLoaderData", gc_timer);
!
// First, mark for unload all ClassLoaderData referencing a dead class loader.
unloading_occurred = ClassLoaderDataGraph::do_unloading(do_cleaning);
if (unloading_occurred) {
JFR_ONLY(Jfr::on_unloading_classes();)
ClassLoaderDataGraph::clean_module_and_package_info();
}
}
! // TODO: just return if !unloading_occurred.
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();
}
{
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
constraints()->purge_loader_constraints();
resolution_errors()->purge_resolution_errors();
}
- }
{
GCTraceTime(Debug, gc, phases) t("ProtectionDomainCacheTable", 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.
_pd_cache_table->trigger_cleanup();
}
-
- if (do_cleaning) {
- GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
- ResolvedMethodTable::trigger_cleanup();
}
return unloading_occurred;
}
--- 1853,1905 ----
// Note: anonymous classes are not in the SD.
bool SystemDictionary::do_unloading(GCTimer* gc_timer,
bool do_cleaning) {
bool unloading_occurred;
+ bool is_concurrent = SafepointSynchronize::is_at_safepoint();
{
GCTraceTime(Debug, gc, phases) t("ClassLoaderData", gc_timer);
! assert_locked_or_safepoint(ClassLoaderDataGraph_lock); // caller locks.
// First, mark for unload all ClassLoaderData referencing a dead class loader.
unloading_occurred = ClassLoaderDataGraph::do_unloading(do_cleaning);
+
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();
}
}
! if (do_cleaning) {
! 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("ProtectionDomainCacheTable", 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();
}
}
return unloading_occurred;
}
< prev index next >