< prev index next >
src/hotspot/share/classfile/classLoaderData.cpp
Print this page
@@ -107,22 +107,29 @@
// JFR and logging support so that the name and klass are available after the
// class_loader oop is no longer alive, during unloading.
void ClassLoaderData::initialize_name_and_klass(Handle class_loader) {
_class_loader_klass = class_loader->klass();
- oop class_loader_name = java_lang_ClassLoader::name(class_loader());
+ oop class_loader_name = java_lang_ClassLoader::nameAndId(class_loader());
if (class_loader_name != NULL) {
Thread* THREAD = Thread::current();
ResourceMark rm(THREAD);
const char* class_loader_instance_name =
java_lang_String::as_utf8_string(class_loader_name);
if (class_loader_instance_name != NULL && class_loader_instance_name[0] != '\0') {
// Can't throw InternalError and SymbolTable doesn't throw OOM anymore.
- _class_loader_name = SymbolTable::new_symbol(class_loader_instance_name, CATCH);
+ _class_loader_name_id = SymbolTable::new_symbol(class_loader_instance_name, CATCH);
}
}
+
+ // The class loader's nameAndId should be set in ClassLoader's constructor.
+ // If for some reason the constructor is not run, instead of leaving the name set
+ // to null, fallback to the <qualified-class-name>.
+ if (_class_loader_name_id == NULL) {
+ _class_loader_name_id = _class_loader_klass->name();
+ }
}
ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous) :
_is_anonymous(is_anonymous),
// An anonymous class loader data doesn't have anything to keep
@@ -132,11 +139,11 @@
_metaspace(NULL), _unloading(false), _klasses(NULL),
_modules(NULL), _packages(NULL), _unnamed_module(NULL), _dictionary(NULL),
_claimed(0), _modified_oops(true), _accumulated_modified_oops(false),
_jmethod_ids(NULL), _handles(), _deallocate_list(NULL),
_next(NULL),
- _class_loader_klass(NULL), _class_loader_name(NULL),
+ _class_loader_klass(NULL), _class_loader_name_id(NULL),
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true,
Monitor::_safepoint_check_never)) {
if (!h_class_loader.is_null()) {
_class_loader = _handles.add(h_class_loader());
@@ -909,32 +916,29 @@
ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(Handle loader) {
// Add a new class loader data to the graph.
return ClassLoaderDataGraph::add(loader, true);
}
+// Caller needs ResourceMark
+// If the defining loader has a name explicitly set then '<loader-name>' @<id>
+// If the defining loader has no name then <qualified-class-name> @<id>
+// If built-in loader, then omit '@<id>' as there is only one instance.
const char* ClassLoaderData::loader_name() const {
- if (is_unloading()) {
if (_class_loader_klass == NULL) {
- return "<bootloader>";
- } else if (_class_loader_name != NULL) {
- return _class_loader_name->as_C_string();
+ return "'bootstrap'";
} else {
- return _class_loader_klass->name()->as_C_string();
- }
- } else {
- // Handles null class loader
- return SystemDictionary::loader_name(class_loader());
+ assert(_class_loader_name_id != NULL, "encountered a null class loader name");
+ return _class_loader_name_id->as_C_string();
}
}
-
void ClassLoaderData::print_value_on(outputStream* out) const {
if (!is_unloading() && class_loader() != NULL) {
out->print("loader data: " INTPTR_FORMAT " for instance ", p2i(this));
class_loader()->print_value_on(out); // includes loader_name() and address of class loader instance
} else {
- // loader data: 0xsomeaddr of <bootloader>
+ // loader data: 0xsomeaddr of 'bootstrap'
out->print("loader data: " INTPTR_FORMAT " of %s", p2i(this), loader_name());
}
if (is_anonymous()) {
out->print(" anonymous");
}
@@ -1235,11 +1239,11 @@
void ClassLoaderDataGraph::print_dictionary_statistics(outputStream* st) {
FOR_ALL_DICTIONARY(cld) {
ResourceMark rm;
stringStream tempst;
- tempst.print("System Dictionary for %s", cld->loader_name());
+ tempst.print("System Dictionary for %s class loader", cld->loader_name());
cld->dictionary()->print_table_statistics(st, tempst.as_string());
}
}
GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() {
< prev index next >