@@ -158,39 +158,44 @@ void vmClasses::resolve_all(TRAPS) {
158158 java_lang_Object::register_natives (CHECK);
159159
160160 // Calculate offsets for String and Class classes since they are loaded and
161- // can be used after this point.
161+ // can be used after this point. These are no-op when CDS is enabled.
162162 java_lang_String::compute_offsets ();
163163 java_lang_Class::compute_offsets ();
164164
165165 // Fixup mirrors for classes loaded before java.lang.Class.
166166 Universe::initialize_basic_type_mirrors (CHECK);
167167 Universe::fixup_mirrors (CHECK);
168168
169- // do a bunch more:
170- resolve_through (VM_CLASS_ID (Reference_klass), scan, CHECK);
171-
172- // The offsets for jlr.Reference must be computed before
173- // InstanceRefKlass::update_nonstatic_oop_maps is called. That function uses
174- // the offsets to remove the referent and discovered fields from the oop maps,
175- // as they are treated in a special way by the GC. Removing these oops from the
176- // oop maps must be done before the usual subclasses of jlr.Reference are loaded.
177- java_lang_ref_Reference::compute_offsets ();
178-
179- // Preload ref klasses and set reference types
180- vmClasses::Reference_klass ()->set_reference_type (REF_OTHER);
181- InstanceRefKlass::update_nonstatic_oop_maps (vmClasses::Reference_klass ());
182-
183- resolve_through (VM_CLASS_ID (PhantomReference_klass), scan, CHECK);
184- vmClasses::SoftReference_klass ()->set_reference_type (REF_SOFT);
185- vmClasses::WeakReference_klass ()->set_reference_type (REF_WEAK);
186- vmClasses::FinalReference_klass ()->set_reference_type (REF_FINAL);
187- vmClasses::PhantomReference_klass ()->set_reference_type (REF_PHANTOM);
188-
189- // JSR 292 classes
190- vmClassID jsr292_group_start = VM_CLASS_ID (MethodHandle_klass);
191- vmClassID jsr292_group_end = VM_CLASS_ID (VolatileCallSite_klass);
192- resolve_until (jsr292_group_start, scan, CHECK);
193- resolve_through (jsr292_group_end, scan, CHECK);
169+ if (UseSharedSpaces) {
170+ // These should already have been initialized during CDS dump.
171+ assert (vmClasses::Reference_klass ()->reference_type () == REF_OTHER, " sanity" );
172+ assert (vmClasses::SoftReference_klass ()->reference_type () == REF_SOFT, " sanity" );
173+ assert (vmClasses::WeakReference_klass ()->reference_type () == REF_WEAK, " sanity" );
174+ assert (vmClasses::FinalReference_klass ()->reference_type () == REF_FINAL, " sanity" );
175+ assert (vmClasses::PhantomReference_klass ()->reference_type () == REF_PHANTOM, " sanity" );
176+ } else {
177+ // If CDS is not enabled, the references classes must be initialized in
178+ // this order before the rest of the vmClasses can be resolved.
179+ resolve_through (VM_CLASS_ID (Reference_klass), scan, CHECK);
180+
181+ // The offsets for jlr.Reference must be computed before
182+ // InstanceRefKlass::update_nonstatic_oop_maps is called. That function uses
183+ // the offsets to remove the referent and discovered fields from the oop maps,
184+ // as they are treated in a special way by the GC. Removing these oops from the
185+ // oop maps must be done before the usual subclasses of jlr.Reference are loaded.
186+ java_lang_ref_Reference::compute_offsets ();
187+
188+ // Preload ref klasses and set reference types
189+ vmClasses::Reference_klass ()->set_reference_type (REF_OTHER);
190+ InstanceRefKlass::update_nonstatic_oop_maps (vmClasses::Reference_klass ());
191+
192+ resolve_through (VM_CLASS_ID (PhantomReference_klass), scan, CHECK);
193+ vmClasses::SoftReference_klass ()->set_reference_type (REF_SOFT);
194+ vmClasses::WeakReference_klass ()->set_reference_type (REF_WEAK);
195+ vmClasses::FinalReference_klass ()->set_reference_type (REF_FINAL);
196+ vmClasses::PhantomReference_klass ()->set_reference_type (REF_PHANTOM);
197+ }
198+
194199 resolve_until (vmClassID::LIMIT, scan, CHECK);
195200
196201 CollectedHeap::set_filler_object_klass (vmClasses::FillerObject_klass ());
0 commit comments