1 /* 2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "cds/archiveBuilder.hpp" 27 #include "cds/archiveUtils.inline.hpp" 28 #include "cds/cdsAccess.hpp" 29 #include "cds/cdsConfig.hpp" 30 #include "cds/cdsProtectionDomain.hpp" 31 #include "cds/classPrelinker.hpp" 32 #include "cds/classPreloader.hpp" 33 #include "cds/heapShared.hpp" 34 #include "cds/lambdaFormInvokers.inline.hpp" 35 #include "classfile/classLoader.hpp" 36 #include "classfile/dictionary.hpp" 37 #include "classfile/systemDictionary.hpp" 38 #include "classfile/systemDictionaryShared.hpp" 39 #include "classfile/vmClasses.hpp" 40 #include "compiler/compilationPolicy.hpp" 41 #include "memory/resourceArea.hpp" 42 #include "oops/constantPool.inline.hpp" 43 #include "oops/instanceKlass.hpp" 44 #include "oops/klass.inline.hpp" 45 #include "oops/trainingData.hpp" 46 #include "runtime/handles.inline.hpp" 47 #include "runtime/javaCalls.hpp" 48 #include "runtime/perfData.inline.hpp" 49 #include "runtime/timer.hpp" 50 #include "services/management.hpp" 51 52 ClassPreloader::ClassesTable* ClassPreloader::_vm_classes = nullptr; 53 ClassPreloader::ClassesTable* ClassPreloader::_preloaded_classes = nullptr; 54 ClassPreloader::ClassesTable* ClassPreloader::_platform_initiated_classes = nullptr; 55 ClassPreloader::ClassesTable* ClassPreloader::_app_initiated_classes = nullptr; 56 bool ClassPreloader::_record_javabase_only = true; 57 bool ClassPreloader::_preload_javabase_only = true; 58 ClassPreloader::PreloadedKlasses ClassPreloader::_static_preloaded_classes; 59 ClassPreloader::PreloadedKlasses ClassPreloader::_dynamic_preloaded_classes; 60 Array<InstanceKlass*>* ClassPreloader::_unregistered_classes_from_preimage = nullptr; 61 62 static PerfCounter* _perf_classes_preloaded = nullptr; 63 static PerfTickCounters* _perf_class_preload_counters = nullptr; 64 65 void ClassPreloader::initialize() { 66 _vm_classes = new (mtClass)ClassesTable(); 67 _preloaded_classes = new (mtClass)ClassesTable(); 68 _platform_initiated_classes = new (mtClass)ClassesTable(); 69 _app_initiated_classes = new (mtClass)ClassesTable(); 70 71 for (auto id : EnumRange<vmClassID>{}) { 72 add_one_vm_class(vmClasses::klass_at(id)); 73 } 74 75 if (_static_preloaded_classes._boot != nullptr && !CDSConfig::is_dumping_final_static_archive()) { 76 assert(CDSConfig::is_dumping_dynamic_archive(), "must be"); 77 add_preloaded_classes(_static_preloaded_classes._boot); 78 add_preloaded_classes(_static_preloaded_classes._boot2); 79 add_preloaded_classes(_static_preloaded_classes._platform); 80 add_preloaded_classes(_static_preloaded_classes._app); 81 82 add_unrecorded_initiated_classes(_platform_initiated_classes, _static_preloaded_classes._platform_initiated); 83 add_unrecorded_initiated_classes(_app_initiated_classes, _static_preloaded_classes._app_initiated); 84 } 85 86 // Record all the initiated classes that we used during dump time. This covers the verification constraints and 87 // (resolved) class loader constraints. 88 add_initiated_classes_for_loader(ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader()), 89 "platform", _platform_initiated_classes); 90 add_initiated_classes_for_loader(ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_system_loader()), 91 "app", _app_initiated_classes); 92 } 93 94 void ClassPreloader::dispose() { 95 delete _vm_classes; 96 delete _preloaded_classes; 97 delete _platform_initiated_classes; 98 delete _app_initiated_classes; 99 _vm_classes = nullptr; 100 _preloaded_classes = nullptr; 101 _platform_initiated_classes = nullptr; 102 _app_initiated_classes = nullptr; 103 } 104 105 bool ClassPreloader::is_vm_class(InstanceKlass* ik) { 106 return (_vm_classes->get(ik) != nullptr); 107 } 108 109 void ClassPreloader::add_one_vm_class(InstanceKlass* ik) { 110 bool created; 111 add_preloaded_class(ik); 112 _vm_classes->put_if_absent(ik, &created); 113 if (created) { 114 InstanceKlass* super = ik->java_super(); 115 if (super != nullptr) { 116 add_one_vm_class(super); 117 } 118 Array<InstanceKlass*>* ifs = ik->local_interfaces(); 119 for (int i = 0; i < ifs->length(); i++) { 120 add_one_vm_class(ifs->at(i)); 121 } 122 } 123 } 124 125 bool ClassPreloader::is_preloaded_class(InstanceKlass* ik) { 126 return (_preloaded_classes->get(ik) != nullptr); 127 } 128 129 void ClassPreloader::add_preloaded_class(InstanceKlass* ik) { 130 bool created; 131 _preloaded_classes->put_if_absent(ik, &created); 132 } 133 134 void ClassPreloader::add_preloaded_classes(Array<InstanceKlass*>* klasses) { 135 for (int i = 0; i < klasses->length(); i++) { 136 assert(klasses->at(i)->is_shared() && klasses->at(i)->is_loaded(), "must be"); 137 _preloaded_classes->put_when_absent(klasses->at(i), true); 138 } 139 } 140 141 void ClassPreloader::add_unrecorded_initiated_classes(ClassesTable* table, Array<InstanceKlass*>* klasses) { 142 // These initiated classes are already recorded in the static archive. There's no need to 143 // record them again for the dynamic archive. 144 assert(CDSConfig::is_dumping_dynamic_archive(), "must be"); 145 bool need_to_record = false; 146 for (int i = 0; i < klasses->length(); i++) { 147 InstanceKlass* ik = klasses->at(i); 148 table->put_when_absent(ik, need_to_record); 149 } 150 } 151 152 void ClassPreloader::add_extra_initiated_classes(PreloadedKlasses* table) { 153 if (table->_app->length() > 0) { 154 // Add all public classes in boot/platform to the app loader. This speeds up 155 // Class.forName() operations in frameworks. 156 GrowableArray<Klass*>* klasses = ArchiveBuilder::current()->klasses(); 157 for (GrowableArrayIterator<Klass*> it = klasses->begin(); it != klasses->end(); ++it) { 158 Klass* k = *it; 159 if (k->is_instance_klass() && !k->name()->starts_with("jdk/proxy")) { // FIXME add SystemDictionaryShared::is_archived_dynamic_proxy_class(ik) 160 // TODO: only add classes that are visible to unnamed module in app loader. 161 InstanceKlass* ik = InstanceKlass::cast(k); 162 if (ik->is_public() && (ik->is_shared_boot_class() || ik->is_shared_platform_class())) { 163 add_initiated_class(_app_initiated_classes, "app", ik); 164 } 165 } 166 } 167 } 168 } 169 170 class ClassPreloader::RecordInitiatedClassesClosure : public KlassClosure { 171 ClassLoaderData* _loader_data; 172 const char* _loader_name; 173 ClassesTable* _table; 174 public: 175 RecordInitiatedClassesClosure(ClassLoaderData* loader_data, const char* loader_name, ClassesTable* table) : 176 _loader_data(loader_data), _loader_name(loader_name), _table(table) {} 177 virtual void do_klass(Klass* k) { 178 if (k->is_instance_klass() && k->class_loader_data() != _loader_data) { 179 add_initiated_class(_table, _loader_name, InstanceKlass::cast(k)); 180 } 181 } 182 }; 183 184 void ClassPreloader::add_initiated_classes_for_loader(ClassLoaderData* loader_data, const char* loader_name, ClassesTable* table) { 185 if (loader_data != nullptr) { 186 MonitorLocker mu1(SystemDictionary_lock); 187 RecordInitiatedClassesClosure mk(loader_data, loader_name, table); 188 loader_data->dictionary()->all_entries_do(&mk); 189 } 190 } 191 192 // ik has a reference to target: 193 // - target is a declared supertype of ik, or 194 // - one of the constant pool entries in ik references target 195 void ClassPreloader::add_initiated_class(InstanceKlass* ik, InstanceKlass* target) { 196 if (ik->shared_class_loader_type() == target->shared_class_loader_type()) { 197 return; 198 } 199 200 if (SystemDictionary::is_platform_class_loader(ik->class_loader())) { 201 add_initiated_class(_platform_initiated_classes, "platform", target); 202 } else { 203 assert(SystemDictionary::is_system_class_loader(ik->class_loader()), "must be"); 204 add_initiated_class(_app_initiated_classes, "app", target); 205 } 206 } 207 208 void ClassPreloader::add_initiated_class(ClassesTable* initiated_classes, const char* loader_name, InstanceKlass* target) { 209 bool need_to_record = true; 210 bool created; 211 initiated_classes->put_if_absent(target, need_to_record, &created); 212 if (created && log_is_enabled(Trace, cds, resolve)) { 213 ResourceMark rm; 214 log_trace(cds, resolve)("%s loader initiated %s", loader_name, target->external_name()); 215 } 216 } 217 218 bool ClassPreloader::is_in_javabase(InstanceKlass* ik) { 219 if (ik->is_hidden() && HeapShared::is_lambda_form_klass(ik)) { 220 return true; 221 } 222 223 return (ik->module() != nullptr && 224 ik->module()->name() != nullptr && 225 ik->module()->name()->equals("java.base")); 226 } 227 228 class ClassPreloader::PreloadedKlassRecorder : StackObj { 229 int _loader_type; 230 ResourceHashtable<InstanceKlass*, bool, 15889, AnyObj::RESOURCE_AREA, mtClassShared> _seen_classes; 231 GrowableArray<InstanceKlass*> _list; 232 bool loader_type_matches(InstanceKlass* ik) { 233 InstanceKlass* buffered_ik = ArchiveBuilder::current()->get_buffered_addr(ik); 234 return buffered_ik->shared_class_loader_type() == _loader_type; 235 } 236 237 void maybe_record(InstanceKlass* ik) { 238 bool created; 239 _seen_classes.put_if_absent(ik, true, &created); 240 if (!created) { 241 // Already seen this class when we walked the hierarchy of a previous class 242 return; 243 } 244 if (!loader_type_matches(ik)) { 245 return; 246 } 247 248 if (ik->is_hidden()) { 249 assert(ik->shared_class_loader_type() != ClassLoader::OTHER, "must have been set"); 250 if (!CDSConfig::is_dumping_invokedynamic()) { 251 return; 252 } 253 assert(HeapShared::is_lambda_form_klass(ik) || HeapShared::is_lambda_proxy_klass(ik), "must be"); 254 } 255 256 if (is_vm_class(ik)) { 257 // vmClasses are loaded in vmClasses::resolve_all() at the very beginning 258 // of VM bootstrap, before ClassPreloader::runtime_preload() is called. 259 return; 260 } 261 262 if (_loader_type == ClassLoader::BOOT_LOADER) { 263 if (_record_javabase_only != is_in_javabase(ik)) { 264 return; 265 } 266 } 267 268 if (MetaspaceObj::is_shared(ik)) { 269 if (CDSConfig::is_dumping_dynamic_archive()) { 270 return; 271 } else { 272 assert(CDSConfig::is_dumping_final_static_archive(), "must be"); 273 } 274 } 275 276 if (!ik->is_hidden()) { 277 // Do not preload any module classes that are not from the modules images, 278 // since such classes may not be loadable at runtime 279 int scp_index = ik->shared_classpath_index(); 280 assert(scp_index >= 0, "must be"); 281 SharedClassPathEntry* scp_entry = FileMapInfo::shared_path(scp_index); 282 if (scp_entry->in_named_module() && !scp_entry->is_modules_image()) { 283 return; 284 } 285 } 286 287 InstanceKlass* s = ik->java_super(); 288 if (s != nullptr) { 289 maybe_record(s); 290 add_initiated_class(ik, s); 291 } 292 293 Array<InstanceKlass*>* interfaces = ik->local_interfaces(); 294 int num_interfaces = interfaces->length(); 295 for (int index = 0; index < num_interfaces; index++) { 296 InstanceKlass* intf = interfaces->at(index); 297 maybe_record(intf); 298 add_initiated_class(ik, intf); 299 } 300 301 _list.append((InstanceKlass*)ArchiveBuilder::get_buffered_klass(ik)); 302 _preloaded_classes->put_when_absent(ik, true); 303 304 if (log_is_enabled(Info, cds, preload)) { 305 ResourceMark rm; 306 const char* loader_name; 307 if (_loader_type == ClassLoader::BOOT_LOADER) { 308 if (_record_javabase_only) { 309 loader_name = "boot "; 310 } else { 311 loader_name = "boot2"; 312 } 313 } else if (_loader_type == ClassLoader::PLATFORM_LOADER) { 314 loader_name = "plat "; 315 } else { 316 loader_name = "app "; 317 } 318 319 log_info(cds, preload)("%s %s", loader_name, ik->external_name()); 320 } 321 } 322 323 public: 324 PreloadedKlassRecorder(int loader_type) : _loader_type(loader_type), _seen_classes(), _list() {} 325 326 void iterate() { 327 GrowableArray<Klass*>* klasses = ArchiveBuilder::current()->klasses(); 328 for (GrowableArrayIterator<Klass*> it = klasses->begin(); it != klasses->end(); ++it) { 329 Klass* k = *it; 330 //assert(!k->is_shared(), "must be"); 331 if (k->is_instance_klass()) { 332 maybe_record(InstanceKlass::cast(k)); 333 } 334 } 335 } 336 337 Array<InstanceKlass*>* to_array() { 338 return ArchiveUtils::archive_array(&_list); 339 } 340 }; 341 342 Array<InstanceKlass*>* ClassPreloader::record_preloaded_classes(int loader_type) { 343 ResourceMark rm; 344 PreloadedKlassRecorder recorder(loader_type); 345 recorder.iterate(); 346 return recorder.to_array(); 347 } 348 349 void ClassPreloader::record_preloaded_classes(bool is_static_archive) { 350 if (PreloadSharedClasses) { 351 PreloadedKlasses* table = (is_static_archive) ? &_static_preloaded_classes : &_dynamic_preloaded_classes; 352 353 _record_javabase_only = true; 354 table->_boot = record_preloaded_classes(ClassLoader::BOOT_LOADER); 355 _record_javabase_only = false; 356 table->_boot2 = record_preloaded_classes(ClassLoader::BOOT_LOADER); 357 358 table->_platform = record_preloaded_classes(ClassLoader::PLATFORM_LOADER); 359 table->_app = record_preloaded_classes(ClassLoader::APP_LOADER); 360 361 add_extra_initiated_classes(table); 362 } 363 } 364 365 Array<InstanceKlass*>* ClassPreloader::record_initiated_classes(ClassesTable* table) { 366 ResourceMark rm; 367 GrowableArray<InstanceKlass*> tmp_array; 368 369 auto collector = [&] (InstanceKlass* ik, bool need_to_record) { 370 if (!need_to_record) { 371 return; 372 } 373 374 if (CDSConfig::is_dumping_final_static_archive() || !ik->is_shared()) { 375 if (SystemDictionaryShared::is_excluded_class(ik)) { 376 return; 377 } 378 ik = (InstanceKlass*)ArchiveBuilder::get_buffered_klass(ik); 379 } 380 tmp_array.append(ik); 381 if (log_is_enabled(Info, cds, preload)) { 382 ResourceMark rm; 383 const char* loader_name; 384 if (table == _platform_initiated_classes) { 385 loader_name = "plat "; 386 } else { 387 loader_name = "app "; 388 } 389 log_info(cds, preload)("%s %s (initiated)", loader_name, ik->external_name()); 390 } 391 }; 392 table->iterate_all(collector); 393 394 return ArchiveUtils::archive_array(&tmp_array); 395 } 396 397 void ClassPreloader::record_initiated_classes(bool is_static_archive) { 398 if (PreloadSharedClasses) { 399 PreloadedKlasses* table = (is_static_archive) ? &_static_preloaded_classes : &_dynamic_preloaded_classes; 400 table->_platform_initiated = record_initiated_classes(_platform_initiated_classes); 401 table->_app_initiated = record_initiated_classes(_app_initiated_classes); 402 } 403 } 404 405 void ClassPreloader::record_unregistered_classes() { 406 if (CDSConfig::is_dumping_preimage_static_archive()) { 407 GrowableArray<InstanceKlass*> unreg_classes; 408 GrowableArray<Klass*>* klasses = ArchiveBuilder::current()->klasses(); 409 for (int i = 0; i < klasses->length(); i++) { 410 Klass* k = klasses->at(i); 411 if (k->is_instance_klass()) { 412 InstanceKlass* ik = InstanceKlass::cast(k); 413 if (ik->is_shared_unregistered_class()) { 414 unreg_classes.append((InstanceKlass*)ArchiveBuilder::get_buffered_klass(ik)); 415 } 416 } 417 } 418 _unregistered_classes_from_preimage = ArchiveUtils::archive_array(&unreg_classes); 419 } else { 420 _unregistered_classes_from_preimage = nullptr; 421 } 422 } 423 424 void ClassPreloader::serialize(SerializeClosure* soc, bool is_static_archive) { 425 PreloadedKlasses* table = (is_static_archive) ? &_static_preloaded_classes : &_dynamic_preloaded_classes; 426 427 soc->do_ptr((void**)&table->_boot); 428 soc->do_ptr((void**)&table->_boot2); 429 soc->do_ptr((void**)&table->_platform); 430 soc->do_ptr((void**)&table->_platform_initiated); 431 soc->do_ptr((void**)&table->_app); 432 soc->do_ptr((void**)&table->_app_initiated); 433 434 if (is_static_archive) { 435 soc->do_ptr((void**)&_unregistered_classes_from_preimage); 436 } 437 438 if (table->_boot != nullptr && table->_boot->length() > 0) { 439 CDSConfig::set_has_preloaded_classes(); 440 } 441 442 if (is_static_archive && soc->reading() && UsePerfData) { 443 JavaThread* THREAD = JavaThread::current(); 444 NEWPERFEVENTCOUNTER(_perf_classes_preloaded, SUN_CLS, "preloadedClasses"); 445 NEWPERFTICKCOUNTERS(_perf_class_preload_counters, SUN_CLS, "classPreload"); 446 } 447 } 448 449 int ClassPreloader::num_platform_initiated_classes() { 450 if (PreloadSharedClasses) { 451 PreloadedKlasses* table = CDSConfig::is_dumping_dynamic_archive() ? &_dynamic_preloaded_classes : &_static_preloaded_classes; 452 return table->_platform_initiated->length(); 453 } 454 return 0; 455 } 456 457 int ClassPreloader::num_app_initiated_classes() { 458 if (PreloadSharedClasses) { 459 PreloadedKlasses* table = CDSConfig::is_dumping_dynamic_archive() ? &_dynamic_preloaded_classes : &_static_preloaded_classes; 460 return table->_app_initiated->length(); 461 } 462 return 0; 463 } 464 465 volatile bool _class_preloading_finished = false; 466 467 bool ClassPreloader::class_preloading_finished() { 468 if (!UseSharedSpaces) { 469 return true; 470 } else { 471 // The ConstantPools of preloaded classes have references to other preloaded classes. We don't 472 // want any Java code (including JVMCI compiler) to use these classes until all of them 473 // are loaded. 474 return Atomic::load_acquire(&_class_preloading_finished); 475 } 476 } 477 478 // This function is called 4 times: 479 // preload only java.base classes 480 // preload boot classes outside of java.base 481 // preload classes for platform loader 482 // preload classes for app loader 483 void ClassPreloader::runtime_preload(JavaThread* current, Handle loader) { 484 #ifdef ASSERT 485 if (loader() == nullptr) { 486 static bool first_time = true; 487 if (first_time) { 488 // FIXME -- assert that no java code has been executed up to this point. 489 // 490 // Reason: Here, only vmClasses have been loaded. However, their CP might 491 // have some pre-resolved entries that point to classes that are loaded 492 // only by this function! Any Java bytecode that uses such entries will 493 // fail. 494 } 495 first_time = false; 496 } 497 #endif // ASSERT 498 if (UseSharedSpaces) { 499 if (loader() != nullptr && !SystemDictionaryShared::has_platform_or_app_classes()) { 500 // Non-boot classes might have been disabled due to command-line mismatch. 501 Atomic::release_store(&_class_preloading_finished, true); 502 return; 503 } 504 ResourceMark rm(current); 505 ExceptionMark em(current); 506 runtime_preload(&_static_preloaded_classes, loader, current); 507 if (!current->has_pending_exception()) { 508 runtime_preload(&_dynamic_preloaded_classes, loader, current); 509 } 510 _preload_javabase_only = false; 511 512 if (loader() != nullptr && loader() == SystemDictionary::java_system_loader()) { 513 Atomic::release_store(&_class_preloading_finished, true); 514 } 515 } 516 assert(!current->has_pending_exception(), "VM should have exited due to ExceptionMark"); 517 518 if (loader() != nullptr && loader() == SystemDictionary::java_system_loader()) { 519 if (PrintTrainingInfo) { 520 tty->print_cr("==================== archived_training_data ** after all classes preloaded ===================="); 521 TrainingData::print_archived_training_data_on(tty); 522 } 523 524 if (log_is_enabled(Info, cds, jit)) { 525 CDSAccess::test_heap_access_api(); 526 } 527 528 if (CDSConfig::is_dumping_final_static_archive()) { 529 assert(_unregistered_classes_from_preimage != nullptr, "must be"); 530 for (int i = 0; i < _unregistered_classes_from_preimage->length(); i++) { 531 InstanceKlass* ik = _unregistered_classes_from_preimage->at(i); 532 SystemDictionaryShared::init_dumptime_info(ik); 533 SystemDictionaryShared::add_unregistered_class(current, ik); 534 } 535 } 536 } 537 } 538 539 void ClassPreloader::runtime_preload(PreloadedKlasses* table, Handle loader, TRAPS) { 540 PerfTraceTime timer(_perf_class_preload_counters); 541 Array<InstanceKlass*>* preloaded_classes; 542 Array<InstanceKlass*>* initiated_classes = nullptr; 543 const char* loader_name; 544 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(loader()); 545 546 // ResourceMark is missing in the code below due to JDK-8307315 547 ResourceMark rm(THREAD); 548 if (loader() == nullptr) { 549 if (_preload_javabase_only) { 550 loader_name = "boot "; 551 preloaded_classes = table->_boot; 552 } else { 553 loader_name = "boot2"; 554 preloaded_classes = table->_boot2; 555 } 556 } else if (loader() == SystemDictionary::java_platform_loader()) { 557 initiated_classes = table->_platform_initiated; 558 preloaded_classes = table->_platform; 559 loader_name = "plat "; 560 } else { 561 assert(loader() == SystemDictionary::java_system_loader(), "must be"); 562 initiated_classes = table->_app_initiated; 563 preloaded_classes = table->_app; 564 loader_name = "app "; 565 } 566 567 if (initiated_classes != nullptr) { 568 MonitorLocker mu1(SystemDictionary_lock); 569 570 for (int i = 0; i < initiated_classes->length(); i++) { 571 InstanceKlass* ik = initiated_classes->at(i); 572 assert(ik->is_loaded(), "must have already been loaded by a parent loader"); 573 if (log_is_enabled(Info, cds, preload)) { 574 ResourceMark rm; 575 const char* defining_loader = (ik->class_loader() == nullptr ? "boot" : "plat"); 576 log_info(cds, preload)("%s %s (initiated, defined by %s)", loader_name, ik->external_name(), 577 defining_loader); 578 } 579 SystemDictionary::preload_class(THREAD, ik, loader_data); 580 } 581 } 582 583 if (preloaded_classes != nullptr) { 584 for (int i = 0; i < preloaded_classes->length(); i++) { 585 if (UsePerfData) { 586 _perf_classes_preloaded->inc(); 587 } 588 InstanceKlass* ik = preloaded_classes->at(i); 589 if (log_is_enabled(Info, cds, preload)) { 590 ResourceMark rm; 591 log_info(cds, preload)("%s %s%s", loader_name, ik->external_name(), 592 ik->is_loaded() ? " (already loaded)" : ""); 593 } 594 // FIXME Do not load proxy classes if FMG is disabled. 595 596 if (!ik->is_loaded()) { 597 if (ik->is_hidden()) { 598 preload_archived_hidden_class(loader, ik, loader_name, CHECK); 599 } else { 600 InstanceKlass* actual; 601 if (loader() == nullptr) { 602 if (!Universe::is_fully_initialized()) { 603 runtime_preload_class_quick(ik, loader_data, Handle(), CHECK); 604 actual = ik; 605 } else { 606 actual = SystemDictionary::load_instance_class(ik->name(), loader, CHECK); 607 } 608 } else { 609 // Note: we are not adding the locker objects into java.lang.ClassLoader::parallelLockMap, but 610 // that should be harmless. 611 actual = SystemDictionaryShared::find_or_load_shared_class(ik->name(), loader, CHECK); 612 } 613 614 if (actual != ik) { 615 jvmti_agent_error(ik, actual, "preloaded"); 616 } 617 assert(actual->is_loaded(), "must be"); 618 } 619 } 620 621 // FIXME assert - if FMG, package must be archived 622 } 623 624 if (!_preload_javabase_only) { 625 // The java.base classes needs to wait till ClassPreloader::init_javabase_preloaded_classes() 626 for (int i = 0; i < preloaded_classes->length(); i++) { 627 InstanceKlass* ik = preloaded_classes->at(i); 628 if (ik->has_preinitialized_mirror()) { 629 ik->initialize_from_cds(CHECK); 630 } else if (PrelinkSharedClasses && ik->verified_at_dump_time()) { 631 ik->link_class(CHECK); 632 } 633 } 634 } 635 } 636 637 if (!_preload_javabase_only) { 638 HeapShared::initialize_default_subgraph_classes(loader, CHECK); 639 } 640 641 #if 0 642 // Hmm, does JavacBench crash if this block is enabled?? 643 if (VerifyDuringStartup) { 644 VM_Verify verify_op; 645 VMThread::execute(&verify_op); 646 } 647 #endif 648 } 649 650 void ClassPreloader::preload_archived_hidden_class(Handle class_loader, InstanceKlass* ik, 651 const char* loader_name, TRAPS) { 652 DEBUG_ONLY({ 653 assert(ik->super() == vmClasses::Object_klass(), "must be"); 654 for (int i = 0; i < ik->local_interfaces()->length(); i++) { 655 assert(ik->local_interfaces()->at(i)->is_loaded(), "must be"); 656 } 657 }); 658 659 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); 660 if (class_loader() == nullptr) { 661 ik->restore_unshareable_info(loader_data, Handle(), NULL, CHECK); 662 } else { 663 PackageEntry* pkg_entry = CDSProtectionDomain::get_package_entry_from_class(ik, class_loader); 664 Handle protection_domain = 665 CDSProtectionDomain::init_security_info(class_loader, ik, pkg_entry, CHECK); 666 ik->restore_unshareable_info(loader_data, protection_domain, pkg_entry, CHECK); 667 } 668 SystemDictionary::load_shared_class_misc(ik, loader_data); 669 ik->add_to_hierarchy(THREAD); 670 } 671 672 void ClassPreloader::runtime_preload_class_quick(InstanceKlass* ik, ClassLoaderData* loader_data, Handle domain, TRAPS) { 673 assert(!ik->is_loaded(), "sanity"); 674 675 #ifdef ASSERT 676 { 677 InstanceKlass* super = ik->java_super(); 678 if (super != nullptr) { 679 assert(super->is_loaded(), "must have been loaded"); 680 } 681 Array<InstanceKlass*>* intfs = ik->local_interfaces(); 682 for (int i = 0; i < intfs->length(); i++) { 683 assert(intfs->at(i)->is_loaded(), "must have been loaded"); 684 } 685 } 686 #endif 687 688 ik->restore_unshareable_info(loader_data, domain, nullptr, CHECK); 689 SystemDictionary::load_shared_class_misc(ik, loader_data); 690 691 // We are adding to the dictionary but can get away without 692 // holding SystemDictionary_lock, as no other threads will be loading 693 // classes at the same time. 694 assert(!Universe::is_fully_initialized(), "sanity"); 695 Dictionary* dictionary = loader_data->dictionary(); 696 dictionary->add_klass(THREAD, ik->name(), ik); 697 ik->add_to_hierarchy(THREAD); 698 assert(ik->is_loaded(), "Must be in at least loaded state"); 699 } 700 701 void ClassPreloader::jvmti_agent_error(InstanceKlass* expected, InstanceKlass* actual, const char* type) { 702 if (actual->is_shared() && expected->name() == actual->name() && 703 LambdaFormInvokers::may_be_regenerated_class(expected->name())) { 704 // For the 4 regenerated classes (such as java.lang.invoke.Invokers$Holder) there's one 705 // in static archive and one in dynamic archive. If the dynamic archive is loaded, we 706 // load the one from the dynamic archive. 707 return; 708 } 709 ResourceMark rm; 710 log_error(cds)("Unable to resolve %s class from CDS archive: %s", type, expected->external_name()); 711 log_error(cds)("Expected: " INTPTR_FORMAT ", actual: " INTPTR_FORMAT, p2i(expected), p2i(actual)); 712 log_error(cds)("JVMTI class retransformation is not supported when archive was generated with -XX:+PreloadSharedClasses."); 713 MetaspaceShared::unrecoverable_loading_error(); 714 } 715 716 void ClassPreloader::init_javabase_preloaded_classes(TRAPS) { 717 Array<InstanceKlass*>* preloaded_classes = _static_preloaded_classes._boot; 718 if (preloaded_classes != nullptr) { 719 for (int i = 0; i < preloaded_classes->length(); i++) { 720 InstanceKlass* ik = preloaded_classes->at(i); 721 if (ik->has_preinitialized_mirror()) { 722 ik->initialize_from_cds(CHECK); 723 } 724 } 725 } 726 727 // Initialize java.base classes in the default subgraph. 728 HeapShared::initialize_default_subgraph_classes(Handle(), CHECK); 729 } 730 731 void ClassPreloader::replay_training_at_init(Array<InstanceKlass*>* preloaded_classes, TRAPS) { 732 if (preloaded_classes != nullptr) { 733 for (int i = 0; i < preloaded_classes->length(); i++) { 734 InstanceKlass* ik = preloaded_classes->at(i); 735 if (ik->has_preinitialized_mirror() && ik->is_initialized() && !ik->has_init_deps_processed()) { 736 CompilationPolicy::replay_training_at_init(ik, CHECK); 737 } 738 } 739 } 740 } 741 742 void ClassPreloader::replay_training_at_init_for_preloaded_classes(TRAPS) { 743 if (CDSConfig::has_preloaded_classes() && TrainingData::have_data()) { 744 replay_training_at_init(_static_preloaded_classes._boot, CHECK); 745 replay_training_at_init(_static_preloaded_classes._boot2, CHECK); 746 replay_training_at_init(_static_preloaded_classes._platform, CHECK); 747 replay_training_at_init(_static_preloaded_classes._app, CHECK); 748 749 CompilationPolicy::replay_training_at_init(false, CHECK); 750 } 751 } 752 753 void ClassPreloader::print_counters() { 754 if (UsePerfData && _perf_class_preload_counters != nullptr) { 755 LogStreamHandle(Info, init) log; 756 if (log.is_enabled()) { 757 log.print_cr("ClassPreloader:"); 758 log.print_cr(" preload: %ldms (elapsed) %ld (thread) / %ld events", 759 _perf_class_preload_counters->elapsed_counter_value_ms(), 760 _perf_class_preload_counters->thread_counter_value_ms(), 761 _perf_classes_preloaded->get_value()); 762 } 763 } 764 }