1.1 --- a/src/share/vm/classfile/classLoaderData.cpp Thu Aug 01 03:44:03 2019 +0100 1.2 +++ b/src/share/vm/classfile/classLoaderData.cpp Mon Aug 12 18:30:40 2019 +0300 1.3 @@ -64,8 +64,10 @@ 1.4 #include "utilities/growableArray.hpp" 1.5 #include "utilities/macros.hpp" 1.6 #include "utilities/ostream.hpp" 1.7 -#if INCLUDE_TRACE 1.8 -#include "trace/tracing.hpp" 1.9 +#include "utilities/ticks.hpp" 1.10 +#if INCLUDE_JFR 1.11 +#include "jfr/jfr.hpp" 1.12 +#include "jfr/jfrEvents.hpp" 1.13 #endif 1.14 1.15 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; 1.16 @@ -81,7 +83,8 @@ 1.17 _claimed(0), _jmethod_ids(NULL), _handles(), _deallocate_list(NULL), 1.18 _next(NULL), _dependencies(dependencies), 1.19 _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) { 1.20 - // empty 1.21 + 1.22 + JFR_ONLY(INIT_ID(this);) 1.23 } 1.24 1.25 void ClassLoaderData::init_dependencies(TRAPS) { 1.26 @@ -646,6 +649,16 @@ 1.27 } 1.28 } 1.29 1.30 +void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) { 1.31 + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); 1.32 + // Only walk the head until any clds not purged from prior unloading 1.33 + // (CMS doesn't purge right away). 1.34 + for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { 1.35 + assert(cld->is_unloading(), "invariant"); 1.36 + cl->do_cld(cld); 1.37 + } 1.38 +} 1.39 + 1.40 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { 1.41 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { 1.42 CLDClosure* closure = cld->keep_alive() ? strong : weak; 1.43 @@ -740,6 +753,28 @@ 1.44 } 1.45 #endif // PRODUCT 1.46 1.47 +#if INCLUDE_JFR 1.48 +static Ticks class_unload_time; 1.49 +static void post_class_unload_event(Klass* const k) { 1.50 + assert(k != NULL, "invariant"); 1.51 + EventClassUnload event(UNTIMED); 1.52 + event.set_endtime(class_unload_time); 1.53 + event.set_unloadedClass(k); 1.54 + event.set_definingClassLoader(k->class_loader_data()); 1.55 + event.commit(); 1.56 +} 1.57 + 1.58 +static void post_class_unload_events() { 1.59 + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); 1.60 + if (Jfr::is_enabled()) { 1.61 + if (EventClassUnload::is_enabled()) { 1.62 + class_unload_time = Ticks::now(); 1.63 + ClassLoaderDataGraph::classes_unloading_do(&post_class_unload_event); 1.64 + } 1.65 + Jfr::on_unloading_classes(); 1.66 + } 1.67 +} 1.68 +#endif // INCLUDE_JFR 1.69 1.70 // Move class loader data from main list to the unloaded list for unloading 1.71 // and deallocation later. 1.72 @@ -781,7 +816,7 @@ 1.73 } 1.74 1.75 if (seen_dead_loader) { 1.76 - post_class_unload_events(); 1.77 + JFR_ONLY(post_class_unload_events();) 1.78 } 1.79 1.80 return seen_dead_loader; 1.81 @@ -820,20 +855,6 @@ 1.82 Metaspace::purge(); 1.83 } 1.84 1.85 -void ClassLoaderDataGraph::post_class_unload_events(void) { 1.86 -#if INCLUDE_TRACE 1.87 - assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); 1.88 - if (Tracing::enabled()) { 1.89 - if (Tracing::is_event_enabled(TraceClassUnloadEvent)) { 1.90 - assert(_unloading != NULL, "need class loader data unload list!"); 1.91 - _class_unload_time = Ticks::now(); 1.92 - classes_unloading_do(&class_unload_event); 1.93 - } 1.94 - Tracing::on_unloading_classes(); 1.95 - } 1.96 -#endif 1.97 -} 1.98 - 1.99 void ClassLoaderDataGraph::free_deallocate_lists() { 1.100 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) { 1.101 // We need to keep this data until InstanceKlass::purge_previous_version has been 1.102 @@ -969,21 +990,3 @@ 1.103 class_loader()->print_value_on(out); 1.104 } 1.105 } 1.106 - 1.107 -#if INCLUDE_TRACE 1.108 - 1.109 -Ticks ClassLoaderDataGraph::_class_unload_time; 1.110 - 1.111 -void ClassLoaderDataGraph::class_unload_event(Klass* const k) { 1.112 - 1.113 - // post class unload event 1.114 - EventClassUnload event(UNTIMED); 1.115 - event.set_endtime(_class_unload_time); 1.116 - event.set_unloadedClass(k); 1.117 - oop defining_class_loader = k->class_loader(); 1.118 - event.set_definingClassLoader(defining_class_loader != NULL ? 1.119 - defining_class_loader->klass() : (Klass*)NULL); 1.120 - event.commit(); 1.121 -} 1.122 - 1.123 -#endif // INCLUDE_TRACE