--- old/src/hotspot/share/classfile/classLoaderData.hpp 2018-05-21 09:37:06.672683141 +0200 +++ new/src/hotspot/share/classfile/classLoaderData.hpp 2018-05-21 09:37:06.576682496 +0200 @@ -400,9 +400,16 @@ static ClassLoaderData* class_loader_data_or_null(oop loader); static ClassLoaderData* anonymous_class_loader_data(Handle loader); - + // Returns Klass* of associated class loader, or NULL if associated loader is . + // Also works if unloading. Klass* class_loader_klass() const { return _class_loader_klass; } + + // Returns Name of associated class loader. + // Returns NULL if associated class loader is or if no name has been set for + // this loader. + // Also works if unloading. Symbol* class_loader_name() const { return _class_loader_name; } + JFR_ONLY(DEFINE_TRACE_ID_METHODS;) }; --- old/src/hotspot/share/memory/metaspace/printCLDMetaspaceInfoClosure.cpp 2018-05-21 09:37:07.004685371 +0200 +++ new/src/hotspot/share/memory/metaspace/printCLDMetaspaceInfoClosure.cpp 2018-05-21 09:37:06.916684780 +0200 @@ -22,7 +22,8 @@ * */ #include "precompiled.hpp" -#include "classfile/classLoaderData.hpp" +#include "classfile/classLoaderData.inline.hpp" +#include "classfile/javaClasses.hpp" #include "memory/metaspace/printCLDMetaspaceInfoClosure.hpp" #include "memory/resourceArea.hpp" #include "runtime/safepoint.hpp" @@ -63,17 +64,46 @@ _out->print(UINTX_FORMAT_W(4) ": ", _num_loaders); - if (cld->is_anonymous()) { - _out->print("ClassLoaderData " PTR_FORMAT " for anonymous class", p2i(cld)); + // Print "CLD for , instance of " + // or "CLD for , loaded by , instance of " + + ResourceMark rm; + const char* name = NULL; + const char* class_name = NULL; + + // Note: this should also work if unloading: + Klass* k = cld->class_loader_klass(); + if (k != NULL) { + class_name = k->external_name(); + Symbol* s = cld->class_loader_name(); + if (s != NULL) { + name = s->as_C_string(); + } else { + name = ""; + } } else { - ResourceMark rm; - _out->print("ClassLoaderData " PTR_FORMAT " for %s", p2i(cld), cld->loader_name()); + name = ""; } + // Print + _out->print("CLD " PTR_FORMAT, p2i(cld)); if (cld->is_unloading()) { _out->print(" (unloading)"); } + _out->print(" for"); + if (cld->is_anonymous()) { + _out->print(" , loaded by"); + } + if (name != NULL) { + _out->print(" %s", name); + } + if (class_name != NULL) { + _out->print(", instance of %s", class_name); + } + + _out->cr(); + // Print statistics this_cld_stat.print_on(_out, _scale, _break_down_by_chunktype); _out->cr();