src/share/vm/classfile/classLoaderData.cpp

changeset 9858
b985cbb00e68
parent 9507
7e72702243a4
child 9866
41515291559a
     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

mercurial