src/hotspot/share/classfile/classLoaderData.cpp
changeset 51543 5303c6c05db6
parent 51530 1f0b605bdc28
child 51608 625a5bdde0c5
equal deleted inserted replaced
51542:04b857edadec 51543:5303c6c05db6
    74 #include "runtime/safepoint.hpp"
    74 #include "runtime/safepoint.hpp"
    75 #include "runtime/safepointVerifiers.hpp"
    75 #include "runtime/safepointVerifiers.hpp"
    76 #include "utilities/growableArray.hpp"
    76 #include "utilities/growableArray.hpp"
    77 #include "utilities/macros.hpp"
    77 #include "utilities/macros.hpp"
    78 #include "utilities/ostream.hpp"
    78 #include "utilities/ostream.hpp"
    79 #include "utilities/ticks.hpp"
       
    80 #if INCLUDE_JFR
       
    81 #include "jfr/jfr.hpp"
       
    82 #include "jfr/jfrEvents.hpp"
       
    83 #endif
       
    84 
    79 
    85 volatile size_t ClassLoaderDataGraph::_num_array_classes = 0;
    80 volatile size_t ClassLoaderDataGraph::_num_array_classes = 0;
    86 volatile size_t ClassLoaderDataGraph::_num_instance_classes = 0;
    81 volatile size_t ClassLoaderDataGraph::_num_instance_classes = 0;
    87 
    82 
    88 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
    83 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
  1314 
  1309 
  1315   return false;
  1310   return false;
  1316 }
  1311 }
  1317 #endif // PRODUCT
  1312 #endif // PRODUCT
  1318 
  1313 
  1319 #if INCLUDE_JFR
       
  1320 static Ticks class_unload_time;
       
  1321 static void post_class_unload_event(Klass* const k) {
       
  1322   assert(k != NULL, "invariant");
       
  1323   EventClassUnload event(UNTIMED);
       
  1324   event.set_endtime(class_unload_time);
       
  1325   event.set_unloadedClass(k);
       
  1326   event.set_definingClassLoader(k->class_loader_data());
       
  1327   event.commit();
       
  1328 }
       
  1329 
       
  1330 static void post_class_unload_events() {
       
  1331   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
       
  1332   if (Jfr::is_enabled()) {
       
  1333     if (EventClassUnload::is_enabled()) {
       
  1334       class_unload_time = Ticks::now();
       
  1335       ClassLoaderDataGraph::classes_unloading_do(&post_class_unload_event);
       
  1336     }
       
  1337     Jfr::on_unloading_classes();
       
  1338   }
       
  1339 }
       
  1340 #endif // INCLUDE_JFR
       
  1341 
       
  1342 // Move class loader data from main list to the unloaded list for unloading
  1314 // Move class loader data from main list to the unloaded list for unloading
  1343 // and deallocation later.
  1315 // and deallocation later.
  1344 bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
  1316 bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
  1345 
  1317 
  1346   // Indicate whether safepoint cleanup is needed.
  1318   // Indicate whether safepoint cleanup is needed.
  1380     }
  1352     }
  1381     dead->set_next(_unloading);
  1353     dead->set_next(_unloading);
  1382     _unloading = dead;
  1354     _unloading = dead;
  1383   }
  1355   }
  1384 
  1356 
  1385   if (seen_dead_loader) {
       
  1386     JFR_ONLY(post_class_unload_events();)
       
  1387   }
       
  1388 
       
  1389   log_debug(class, loader, data)("do_unloading: loaders processed %u, loaders removed %u", loaders_processed, loaders_removed);
  1357   log_debug(class, loader, data)("do_unloading: loaders processed %u, loaders removed %u", loaders_processed, loaders_removed);
  1390 
  1358 
  1391   return seen_dead_loader;
  1359   return seen_dead_loader;
  1392 }
  1360 }
  1393 
  1361