equal
deleted
inserted
replaced
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 |