8202578: Revisit location for class unload events

Use notify_unload_class() to post JFR class unload events instead of doing a separate traversal of the class loader data graph

Reviewed-by: lfoltan, coleenp, mgronlun, egahlin
This commit is contained in:
Harold Seigel 2018-08-28 10:10:11 -04:00
parent 12c27777c8
commit eb51968f00
3 changed files with 16 additions and 32 deletions

View file

@ -76,11 +76,6 @@
#include "utilities/growableArray.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
#include "utilities/ticks.hpp"
#if INCLUDE_JFR
#include "jfr/jfr.hpp"
#include "jfr/jfrEvents.hpp"
#endif
volatile size_t ClassLoaderDataGraph::_num_array_classes = 0;
volatile size_t ClassLoaderDataGraph::_num_instance_classes = 0;
@ -1316,29 +1311,6 @@ bool ClassLoaderDataGraph::contains_loader_data(ClassLoaderData* loader_data) {
}
#endif // PRODUCT
#if INCLUDE_JFR
static Ticks class_unload_time;
static void post_class_unload_event(Klass* const k) {
assert(k != NULL, "invariant");
EventClassUnload event(UNTIMED);
event.set_endtime(class_unload_time);
event.set_unloadedClass(k);
event.set_definingClassLoader(k->class_loader_data());
event.commit();
}
static void post_class_unload_events() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
if (Jfr::is_enabled()) {
if (EventClassUnload::is_enabled()) {
class_unload_time = Ticks::now();
ClassLoaderDataGraph::classes_unloading_do(&post_class_unload_event);
}
Jfr::on_unloading_classes();
}
}
#endif // INCLUDE_JFR
// Move class loader data from main list to the unloaded list for unloading
// and deallocation later.
bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
@ -1382,10 +1354,6 @@ bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
_unloading = dead;
}
if (seen_dead_loader) {
JFR_ONLY(post_class_unload_events();)
}
log_debug(class, loader, data)("do_unloading: loaders processed %u, loaders removed %u", loaders_processed, loaders_removed);
return seen_dead_loader;