< prev index next >
src/share/vm/classfile/classLoaderData.cpp
Print this page
*** 62,73 ****
#include "runtime/safepoint.hpp"
#include "runtime/synchronizer.hpp"
#include "utilities/growableArray.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
! #if INCLUDE_TRACE
! #include "trace/tracing.hpp"
#endif
ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
--- 62,75 ----
#include "runtime/safepoint.hpp"
#include "runtime/synchronizer.hpp"
#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
ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
*** 79,89 ****
_keep_alive(is_anonymous || h_class_loader.is_null()),
_metaspace(NULL), _unloading(false), _klasses(NULL),
_claimed(0), _jmethod_ids(NULL), _handles(), _deallocate_list(NULL),
_next(NULL), _dependencies(dependencies),
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
! // empty
}
void ClassLoaderData::init_dependencies(TRAPS) {
assert(!Universe::is_fully_initialized(), "should only be called when initializing");
assert(is_the_null_class_loader_data(), "should only call this for the null class loader");
--- 81,92 ----
_keep_alive(is_anonymous || h_class_loader.is_null()),
_metaspace(NULL), _unloading(false), _klasses(NULL),
_claimed(0), _jmethod_ids(NULL), _handles(), _deallocate_list(NULL),
_next(NULL), _dependencies(dependencies),
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
!
! JFR_ONLY(INIT_ID(this);)
}
void ClassLoaderData::init_dependencies(TRAPS) {
assert(!Universe::is_fully_initialized(), "should only be called when initializing");
assert(is_the_null_class_loader_data(), "should only call this for the null class loader");
*** 644,653 ****
--- 647,666 ----
for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) {
cl->do_cld(cld);
}
}
+ void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
+ assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
+ // Only walk the head until any clds not purged from prior unloading
+ // (CMS doesn't purge right away).
+ for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) {
+ assert(cld->is_unloading(), "invariant");
+ cl->do_cld(cld);
+ }
+ }
+
void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
CLDClosure* closure = cld->keep_alive() ? strong : weak;
if (closure != NULL) {
closure->do_cld(cld);
*** 738,747 ****
--- 751,782 ----
return false;
}
#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(BoolObjectClosure* is_alive_closure, bool clean_alive) {
ClassLoaderData* data = _head;
*** 779,789 ****
// Clean previous versions and the deallocate list.
ClassLoaderDataGraph::clean_metaspaces();
}
if (seen_dead_loader) {
! post_class_unload_events();
}
return seen_dead_loader;
}
--- 814,824 ----
// Clean previous versions and the deallocate list.
ClassLoaderDataGraph::clean_metaspaces();
}
if (seen_dead_loader) {
! JFR_ONLY(post_class_unload_events();)
}
return seen_dead_loader;
}
*** 818,841 ****
delete purge_me;
}
Metaspace::purge();
}
- void ClassLoaderDataGraph::post_class_unload_events(void) {
- #if INCLUDE_TRACE
- assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
- if (Tracing::enabled()) {
- if (Tracing::is_event_enabled(TraceClassUnloadEvent)) {
- assert(_unloading != NULL, "need class loader data unload list!");
- _class_unload_time = Ticks::now();
- classes_unloading_do(&class_unload_event);
- }
- Tracing::on_unloading_classes();
- }
- #endif
- }
-
void ClassLoaderDataGraph::free_deallocate_lists() {
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
// We need to keep this data until InstanceKlass::purge_previous_version has been
// called on all alive classes. See the comment in ClassLoaderDataGraph::clean_metaspaces.
cld->free_deallocate_list();
--- 853,862 ----
*** 967,989 ****
} else {
out->print("class loader " INTPTR_FORMAT, p2i(this));
class_loader()->print_value_on(out);
}
}
-
- #if INCLUDE_TRACE
-
- Ticks ClassLoaderDataGraph::_class_unload_time;
-
- void ClassLoaderDataGraph::class_unload_event(Klass* const k) {
-
- // post class unload event
- EventClassUnload event(UNTIMED);
- event.set_endtime(_class_unload_time);
- event.set_unloadedClass(k);
- oop defining_class_loader = k->class_loader();
- event.set_definingClassLoader(defining_class_loader != NULL ?
- defining_class_loader->klass() : (Klass*)NULL);
- event.commit();
- }
-
- #endif // INCLUDE_TRACE
--- 988,992 ----
< prev index next >