Possible enhancement: call SharedRuntime::class_loader_name() from SystemDictionary::loader_name(). Currently, SystemDictionary::loader_name() produces loader names such as jdk/internal/loader/ClassLoaders$PlatformClassLoader However, if SharedRuntime::class_loader_name() is called, it produces platform As can be seen by running test/runtime/logging/ClassLoadUnloadTest.java. Is this more helpful or less? Appearances: share/vm/interpreter/linkResolver.cpp:644: const char* loader1_name = SystemDictionary::loader_name(current_loader()); share/vm/interpreter/linkResolver.cpp:646: const char* loader2_name = SystemDictionary::loader_name(resolved_loader()); share/vm/interpreter/linkResolver.cpp:677: const char* loader1_name = SystemDictionary::loader_name(ref_loader()); share/vm/interpreter/linkResolver.cpp:679: const char* loader2_name = SystemDictionary::loader_name(sel_loader()); share/vm/runtime/sharedRuntime.cpp:1976: class_loader_name = SharedRuntime::class_loader_name(klass->class_loader()); share/vm/oops/instanceKlass.cpp:2293: name()->as_C_string(), loader_data->loader_name()); share/vm/oops/instanceKlass.cpp:2302: loader_data->loader_name(), share/vm/oops/instanceKlass.cpp:2309: (loader_data != NULL) ? loader_data->loader_name() : "NULL", share/vm/oops/instanceKlass.cpp:2423: const char* class_loader_name = SystemDictionary::loader_name(class_loader()); share/vm/oops/klassVtable.cpp:500: const char* loader1 = SystemDictionary::loader_name(target_loader()); share/vm/oops/klassVtable.cpp:502: const char* loader2 = SystemDictionary::loader_name(super_loader()); share/vm/oops/klassVtable.cpp:1216: const char* loader1 = SystemDictionary::loader_name(method_holder_loader()); share/vm/oops/klassVtable.cpp:1218: const char* loader2 = SystemDictionary::loader_name(interface_loader()); share/vm/classfile/modules.cpp:329: const char* class_loader_name = SystemDictionary::loader_name(h_loader()); share/vm/classfile/modules.cpp:714: const char* class_loader_name = SystemDictionary::loader_name(loader_data); share/vm/classfile/systemDictionary.hpp:550: static const char* loader_name(const oop loader); share/vm/classfile/systemDictionary.hpp:551: static const char* loader_name(const ClassLoaderData* loader_data); share/vm/classfile/moduleEntry.cpp:506: loader_data()->loader_name(), share/vm/classfile/classFileParser.cpp:4440: this_klass->class_loader_data()->loader_name(), share/vm/classfile/javaClasses.cpp:2828: compute_offset(loader_offset, k, vmSymbols::loader_name(), vmSymbols::classloader_signature()); share/vm/classfile/systemDictionary.cpp:2253: const char* class_loader_name = loader_name(class_loader()); share/vm/classfile/systemDictionary.cpp:2905:const char* SystemDictionary::loader_name(const oop loader) { share/vm/classfile/systemDictionary.cpp:2912:const char* SystemDictionary::loader_name(const ClassLoaderData* loader_data) { share/vm/classfile/systemDictionary.cpp:2914: return (loader == NULL ? "" : SystemDictionary::loader_name(loader)); share/vm/classfile/loaderConstraints.cpp:109: probe->loader_data(i)->loader_name()); share/vm/classfile/loaderConstraints.cpp:121: probe->loader_data(n)->loader_name(), share/vm/classfile/loaderConstraints.cpp:138: probe->loader_data(i)->loader_name()); share/vm/classfile/loaderConstraints.cpp:183: SystemDictionary::loader_name(class_loader1()), share/vm/classfile/loaderConstraints.cpp:184: SystemDictionary::loader_name(class_loader2()), share/vm/classfile/loaderConstraints.cpp:253: SystemDictionary::loader_name(class_loader1()), share/vm/classfile/loaderConstraints.cpp:254: SystemDictionary::loader_name(class_loader2()) share/vm/classfile/loaderConstraints.cpp:267: SystemDictionary::loader_name(class_loader1()) share/vm/classfile/loaderConstraints.cpp:298: SystemDictionary::loader_name(loader())); share/vm/classfile/loaderConstraints.cpp:310: SystemDictionary::loader_name(loader())); share/vm/classfile/loaderConstraints.cpp:361: SystemDictionary::loader_name(loader()), share/vm/classfile/loaderConstraints.cpp:404: p1->loader_data(i)->loader_name()); share/vm/classfile/classLoaderData.hpp:341: const char* loader_name(); share/vm/classfile/classLoaderData.cpp:448: loader_name()); share/vm/classfile/classLoaderData.cpp:484: loader_name()); share/vm/classfile/classLoaderData.cpp:693:const char* ClassLoaderData::loader_name() { share/vm/classfile/classLoaderData.cpp:695: return SystemDictionary::loader_name(class_loader()); share/vm/classfile/classLoaderData.cpp:705: p2i(class_loader() != NULL ? class_loader()->klass() : NULL), loader_name()); share/vm/classfile/classLoaderData.cpp:837: cld->loader_name()); ------------------ Possible change: callers of InstanceKlass::print_class_load_logging() could pass in the class loader and module name by using SharedRuntime::class_loader_and_module_name() instead of passing just the module name. e.g. at share/vm/classfile/classFileParser.cpp:5479: ik->print_class_load_logging(_loader_data, module_name, _stream); ------------------ Note: test/runtime/modules/CCE_module_msg.java verifies correct class cast exception (which uses SharedRuntime::class_loader_and_module_name())