src/hotspot/share/classfile/classLoaderData.cpp
changeset 51405 8b23aa7cef47
parent 51375 b812a85b3aa4
child 51415 0aa5378d4f09
--- a/src/hotspot/share/classfile/classLoaderData.cpp	Tue Aug 14 14:08:04 2018 -0700
+++ b/src/hotspot/share/classfile/classLoaderData.cpp	Tue Aug 14 18:42:14 2018 -0500
@@ -1418,6 +1418,28 @@
   }
 
   if (seen_dead_loader) {
+    data = _head;
+    while (data != NULL) {
+      // Remove entries in the dictionary of live class loader that have
+      // initiated loading classes in a dead class loader.
+      if (data->dictionary() != NULL) {
+        data->dictionary()->do_unloading();
+      }
+      // Walk a ModuleEntry's reads, and a PackageEntry's exports
+      // lists to determine if there are modules on those lists that are now
+      // dead and should be removed.  A module's life cycle is equivalent
+      // to its defining class loader's life cycle.  Since a module is
+      // considered dead if its class loader is dead, these walks must
+      // occur after each class loader's aliveness is determined.
+      if (data->packages() != NULL) {
+        data->packages()->purge_all_package_exports();
+      }
+      if (data->modules_defined()) {
+        data->modules()->purge_all_module_reads();
+      }
+      data = data->next();
+    }
+    SymbolTable::do_check_concurrent_work();
     JFR_ONLY(post_class_unload_events();)
   }