diff -r 53e61697a020 -r d7dcaacb95dd src/hotspot/share/classfile/javaClasses.cpp --- a/src/hotspot/share/classfile/javaClasses.cpp Fri Sep 07 14:44:52 2018 -0400 +++ b/src/hotspot/share/classfile/javaClasses.cpp Fri Sep 07 15:18:14 2018 -0400 @@ -1213,6 +1213,14 @@ bool java_lang_Class::restore_archived_mirror(Klass *k, Handle class_loader, Handle module, Handle protection_domain, TRAPS) { + // Postpone restoring archived mirror until java.lang.Class is loaded. Please + // see more details in SystemDictionary::resolve_preloaded_classes(). + if (!SystemDictionary::Class_klass_loaded()) { + assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized"); + fixup_mirror_list()->push(k); + return true; + } + oop m = MetaspaceShared::materialize_archived_object(k->archived_java_mirror_raw_narrow()); if (m == NULL) { @@ -1225,10 +1233,6 @@ assert(MetaspaceShared::is_archive_object(m), "must be archived mirror object"); Handle mirror(THREAD, m); - // The java.lang.Class field offsets were archived and reloaded from archive. - // No need to put classes on the fixup_mirror_list before java.lang.Class - // is loaded. - if (!k->is_array_klass()) { // - local static final fields with initial values were initialized at dump time