--- old/src/hotspot/share/classfile/systemDictionary.cpp 2018-05-14 22:55:39.628070948 -0700 +++ new/src/hotspot/share/classfile/systemDictionary.cpp 2018-05-14 22:55:39.036048413 -0700 @@ -149,8 +149,6 @@ CHECK); _java_platform_loader = (oop)result.get_jobject(); - - CDS_ONLY(SystemDictionaryShared::initialize(CHECK);) } ClassLoaderData* SystemDictionary::register_loader(Handle class_loader) { @@ -1970,6 +1968,8 @@ _system_loader_lock_obj = oopFactory::new_intArray(0, CHECK); // Initialize basic classes initialize_preloaded_classes(CHECK); + + CDS_ONLY(SystemDictionaryShared::initialize_locks();) } // Compact table of directions on the initialization of klasses: --- old/src/hotspot/share/classfile/systemDictionary.hpp 2018-05-14 22:55:41.072125916 -0700 +++ new/src/hotspot/share/classfile/systemDictionary.hpp 2018-05-14 22:55:40.424101249 -0700 @@ -744,6 +744,7 @@ // table of box klasses (int_klass, etc.) static InstanceKlass* _box_klasses[T_VOID+1]; +private: static oop _java_system_loader; static oop _java_platform_loader; --- old/src/hotspot/share/classfile/systemDictionaryShared.cpp 2018-05-14 22:55:42.500180275 -0700 +++ new/src/hotspot/share/classfile/systemDictionaryShared.cpp 2018-05-14 22:55:41.900157435 -0700 @@ -62,16 +62,8 @@ static Mutex* SharedDictionary_lock = NULL; -void SystemDictionaryShared::initialize(TRAPS) { - if (_java_system_loader != NULL) { - SharedDictionary_lock = new Mutex(Mutex::leaf, "SharedDictionary_lock", true); - - // These classes need to be initialized before calling get_shared_jar_manifest(), etc. - SystemDictionary::ByteArrayInputStream_klass()->initialize(CHECK); - SystemDictionary::File_klass()->initialize(CHECK); - SystemDictionary::Jar_Manifest_klass()->initialize(CHECK); - SystemDictionary::CodeSource_klass()->initialize(CHECK); - } +void SystemDictionaryShared::initialize_locks() { + SharedDictionary_lock = new Mutex(Mutex::leaf, "SharedDictionary_lock", true); } oop SystemDictionaryShared::shared_protection_domain(int index) { @@ -99,6 +91,7 @@ // ByteArrayInputStream bais = new ByteArrayInputStream(buf); InstanceKlass* bais_klass = SystemDictionary::ByteArrayInputStream_klass(); + bais_klass->initialize(CHECK_NH); Handle bais = bais_klass->allocate_instance_handle(CHECK_(empty)); { const char* src = ent->manifest(); @@ -117,6 +110,7 @@ // manifest = new Manifest(bais) InstanceKlass* manifest_klass = SystemDictionary::Jar_Manifest_klass(); + manifest_klass->initialize(CHECK_NH); manifest = manifest_klass->allocate_instance_handle(CHECK_(empty)); { JavaValue result(T_VOID); @@ -141,10 +135,10 @@ Handle path_string = java_lang_String::create_from_str(path, CHECK_(url_h)); Klass* classLoaders_klass = SystemDictionary::jdk_internal_loader_ClassLoaders_klass(); - JavaCalls::call_static(&result, classLoaders_klass, - vmSymbols::toFileURL_name(), - vmSymbols::toFileURL_signature(), - path_string, CHECK_(url_h)); + JavaCalls::call_static(&result, classLoaders_klass, + vmSymbols::toFileURL_name(), + vmSymbols::toFileURL_signature(), + path_string, CHECK_(url_h)); atomic_set_shared_jar_url(shared_path_index, (oop)result.get_jobject()); } @@ -174,7 +168,7 @@ Handle manifest, Handle url, TRAPS) { - assert(class_loader == _java_system_loader, "unexpected class loader"); + assert(SystemDictionary::is_system_class_loader(class_loader()), "unexpected class loader"); // get_package_name() returns a NULL handle if the class is in unnamed package Handle pkgname_string = get_package_name(class_name, CHECK); if (pkgname_string.not_null()) { @@ -229,6 +223,7 @@ Handle url, TRAPS) { // CodeSource cs = new CodeSource(url, null); InstanceKlass* cs_klass = SystemDictionary::CodeSource_klass(); + cs_klass->initialize(CHECK_NH); Handle cs = cs_klass->allocate_instance_handle(CHECK_NH); JavaValue void_result(T_VOID); JavaCalls::call_special(&void_result, cs, cs_klass, --- old/src/hotspot/share/classfile/systemDictionaryShared.hpp 2018-05-14 22:55:43.736227325 -0700 +++ new/src/hotspot/share/classfile/systemDictionaryShared.hpp 2018-05-14 22:55:43.124204028 -0700 @@ -285,7 +285,7 @@ TRAPS); public: - static void initialize(TRAPS); + static void initialize_locks(); // Called by PLATFORM/APP loader only static InstanceKlass* find_or_load_shared_class(Symbol* class_name,