1 /* 2 * Copyright (c) 2023, 2025, 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 "cds/aotLogging.hpp" 26 #include "cds/archiveHeapLoader.hpp" 27 #include "cds/cdsConfig.hpp" 28 #include "cds/cds_globals.hpp" 29 #include "cds/classListWriter.hpp" 30 #include "cds/filemap.hpp" 31 #include "cds/heapShared.hpp" 32 #include "cds/metaspaceShared.hpp" 33 #include "classfile/classLoaderDataShared.hpp" 34 #include "classfile/moduleEntry.hpp" 35 #include "classfile/systemDictionaryShared.hpp" 36 #include "code/aotCodeCache.hpp" 37 #include "include/jvm_io.h" 38 #include "logging/log.hpp" 39 #include "prims/jvmtiExport.hpp" 40 #include "memory/universe.hpp" 41 #include "prims/jvmtiAgentList.hpp" 42 #include "runtime/arguments.hpp" 43 #include "runtime/globals_extension.hpp" 44 #include "runtime/java.hpp" 45 #include "runtime/vmThread.hpp" 46 #include "utilities/defaultStream.hpp" 47 #include "utilities/formatBuffer.hpp" 48 49 bool CDSConfig::_is_dumping_static_archive = false; 50 bool CDSConfig::_is_dumping_preimage_static_archive = false; 51 bool CDSConfig::_is_dumping_final_static_archive = false; 52 bool CDSConfig::_is_dumping_dynamic_archive = false; 53 bool CDSConfig::_is_using_optimized_module_handling = true; 54 bool CDSConfig::_is_dumping_full_module_graph = true; 55 bool CDSConfig::_is_using_full_module_graph = true; 56 bool CDSConfig::_has_aot_linked_classes = false; 57 bool CDSConfig::_is_single_command_training = false; 58 bool CDSConfig::_has_temp_aot_config_file = false; 59 bool CDSConfig::_is_loading_packages = false; 60 bool CDSConfig::_is_loading_protection_domains = false; 61 bool CDSConfig::_is_security_manager_allowed = false; 62 bool CDSConfig::_old_cds_flags_used = false; 63 bool CDSConfig::_new_aot_flags_used = false; 64 bool CDSConfig::_experimental_leyden_flags_used = false; 65 bool CDSConfig::_disable_heap_dumping = false; 66 67 const char* CDSConfig::_default_archive_path = nullptr; 68 const char* CDSConfig::_input_static_archive_path = nullptr; 69 const char* CDSConfig::_input_dynamic_archive_path = nullptr; 70 const char* CDSConfig::_output_archive_path = nullptr; 71 72 JavaThread* CDSConfig::_dumper_thread = nullptr; 73 74 int CDSConfig::get_status() { 75 assert(Universe::is_fully_initialized(), "status is finalized only after Universe is initialized"); 76 return (is_dumping_archive() ? IS_DUMPING_ARCHIVE : 0) | 77 (is_dumping_method_handles() ? IS_DUMPING_METHOD_HANDLES : 0) | 78 (is_dumping_static_archive() ? IS_DUMPING_STATIC_ARCHIVE : 0) | 79 (is_logging_lambda_form_invokers() ? IS_LOGGING_LAMBDA_FORM_INVOKERS : 0) | 80 (is_using_archive() ? IS_USING_ARCHIVE : 0) | 81 (is_dumping_heap() ? IS_DUMPING_HEAP : 0) | 82 (is_logging_dynamic_proxies() ? IS_LOGGING_DYNAMIC_PROXIES : 0) | 83 (is_dumping_packages() ? IS_DUMPING_PACKAGES : 0) | 84 (is_dumping_protection_domains() ? IS_DUMPING_PROTECTION_DOMAINS : 0); 85 } 86 87 DEBUG_ONLY(static bool _cds_ergo_initialize_started = false); 88 89 void CDSConfig::ergo_initialize() { 90 DEBUG_ONLY(_cds_ergo_initialize_started = true); 91 92 if (is_dumping_static_archive() && !is_dumping_final_static_archive()) { 93 // If dumping the classic archive, or making an AOT training run (dumping a preimage archive), 94 // for sanity, parse all classes from classfiles. 95 // TODO: in the future, if we want to support re-training on top of an existing AOT cache, this 96 // needs to be changed. 97 if (RequireSharedSpaces) { 98 if (is_experimental_leyden_workflow()) { 99 log_info(cds)("-Xshare:on flag is ignored when creating a CacheDataStore"); 100 } else { 101 // -Xshare and -XX:AOTMode flags are mutually exclusive: 102 // Class workflow: -Xshare:on and -Xshare:dump cannot take effect at the same time. 103 // JEP 483 workflow: -XX:AOTMode:record and -XX:AOTMode=on cannot take effect at the same time. 104 ShouldNotReachHere(); 105 } 106 } 107 UseSharedSpaces = false; 108 } 109 110 // Initialize shared archive paths which could include both base and dynamic archive paths 111 // This must be after set_ergonomics_flags() called so flag UseCompressedOops is set properly. 112 if (is_dumping_static_archive() || is_using_archive()) { 113 if (new_aot_flags_used()) { 114 ergo_init_aot_paths(); 115 } else if (is_experimental_leyden_workflow()) { 116 ergo_init_experimental_leyden_paths(); 117 } else { 118 ergo_init_classic_archive_paths(); 119 } 120 } 121 122 if (!is_dumping_heap()) { 123 _is_dumping_full_module_graph = false; 124 } 125 126 #ifdef _LP64 127 // 128 // By default, when using AOTClassLinking, use the CompressedOops::HeapBasedNarrowOop 129 // mode so that AOT code can be always work regardless of runtime heap range. 130 // 131 // If you are *absolutely sure* that the CompressedOops::mode() will be the same 132 // between training and production runs (e.g., if you specify -Xmx128m for 133 // both training and production runs, and you know the OS will always reserve 134 // the heap under 4GB), you can explicitly disable this with: 135 // java -XX:+UnlockDiagnosticVMOptions -XX:-UseCompatibleCompressedOops ... 136 // However, this is risky and there's a chance that the production run will be slower 137 // than expected because it is unable to load the AOT code cache. 138 // 139 if (UseCompressedOops && AOTCodeCache::is_caching_enabled()) { 140 FLAG_SET_ERGO_IF_DEFAULT(UseCompatibleCompressedOops, true); 141 } else if (!FLAG_IS_DEFAULT(UseCompatibleCompressedOops)) { 142 FLAG_SET_ERGO(UseCompatibleCompressedOops, false); 143 } 144 #endif // _LP64 145 } 146 147 const char* CDSConfig::default_archive_path() { 148 // The path depends on UseCompressedOops, etc, which are set by GC ergonomics just 149 // before CDSConfig::ergo_initialize() is called. 150 assert(_cds_ergo_initialize_started, "sanity"); 151 if (_default_archive_path == nullptr) { 152 char jvm_path[JVM_MAXPATHLEN]; 153 os::jvm_path(jvm_path, sizeof(jvm_path)); 154 char *end = strrchr(jvm_path, *os::file_separator()); 155 if (end != nullptr) *end = '\0'; 156 stringStream tmp; 157 tmp.print("%s%sclasses", jvm_path, os::file_separator()); 158 #ifdef _LP64 159 if (!UseCompressedOops) { 160 tmp.print_raw("_nocoops"); 161 } 162 if (UseCompactObjectHeaders) { 163 // Note that generation of xxx_coh.jsa variants require 164 // --enable-cds-archive-coh at build time 165 tmp.print_raw("_coh"); 166 } 167 #endif 168 tmp.print_raw(".jsa"); 169 _default_archive_path = os::strdup(tmp.base()); 170 } 171 return _default_archive_path; 172 } 173 174 int CDSConfig::num_archive_paths(const char* path_spec) { 175 if (path_spec == nullptr) { 176 return 0; 177 } 178 int npaths = 1; 179 char* p = (char*)path_spec; 180 while (*p != '\0') { 181 if (*p == os::path_separator()[0]) { 182 npaths++; 183 } 184 p++; 185 } 186 return npaths; 187 } 188 189 void CDSConfig::extract_archive_paths(const char* archive_path, 190 const char** base_archive_path, 191 const char** top_archive_path) { 192 char* begin_ptr = (char*)archive_path; 193 char* end_ptr = strchr((char*)archive_path, os::path_separator()[0]); 194 if (end_ptr == nullptr || end_ptr == begin_ptr) { 195 vm_exit_during_initialization("Base archive was not specified", archive_path); 196 } 197 size_t len = end_ptr - begin_ptr; 198 char* cur_path = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal); 199 strncpy(cur_path, begin_ptr, len); 200 cur_path[len] = '\0'; 201 *base_archive_path = cur_path; 202 203 begin_ptr = ++end_ptr; 204 if (*begin_ptr == '\0') { 205 vm_exit_during_initialization("Top archive was not specified", archive_path); 206 } 207 end_ptr = strchr(begin_ptr, '\0'); 208 assert(end_ptr != nullptr, "sanity"); 209 len = end_ptr - begin_ptr; 210 cur_path = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal); 211 strncpy(cur_path, begin_ptr, len + 1); 212 *top_archive_path = cur_path; 213 } 214 215 void CDSConfig::ergo_init_classic_archive_paths() { 216 assert(_cds_ergo_initialize_started, "sanity"); 217 if (ArchiveClassesAtExit != nullptr) { 218 assert(!RecordDynamicDumpInfo, "already checked"); 219 if (is_dumping_static_archive()) { 220 vm_exit_during_initialization("-XX:ArchiveClassesAtExit cannot be used with -Xshare:dump"); 221 } 222 check_unsupported_dumping_module_options(); 223 224 if (os::same_files(default_archive_path(), ArchiveClassesAtExit)) { 225 vm_exit_during_initialization( 226 "Cannot specify the default CDS archive for -XX:ArchiveClassesAtExit", default_archive_path()); 227 } 228 } 229 230 if (SharedArchiveFile == nullptr) { 231 _input_static_archive_path = default_archive_path(); 232 if (is_dumping_static_archive()) { 233 _output_archive_path = _input_static_archive_path; 234 } 235 } else { 236 int num_archives = num_archive_paths(SharedArchiveFile); 237 assert(num_archives > 0, "must be"); 238 239 if (is_dumping_archive() && num_archives > 1) { 240 vm_exit_during_initialization( 241 "Cannot have more than 1 archive file specified in -XX:SharedArchiveFile during CDS dumping"); 242 } 243 244 if (is_dumping_static_archive()) { 245 assert(num_archives == 1, "just checked above"); 246 // Static dump is simple: only one archive is allowed in SharedArchiveFile. This file 247 // will be overwritten regardless of its contents 248 _output_archive_path = SharedArchiveFile; 249 } else { 250 // SharedArchiveFile may specify one or two files. In case (c), the path for base.jsa 251 // is read from top.jsa 252 // (a) 1 file: -XX:SharedArchiveFile=base.jsa 253 // (b) 2 files: -XX:SharedArchiveFile=base.jsa:top.jsa 254 // (c) 2 files: -XX:SharedArchiveFile=top.jsa 255 // 256 // However, if either RecordDynamicDumpInfo or ArchiveClassesAtExit is used, we do not 257 // allow cases (b) and (c). Case (b) is already checked above. 258 259 if (num_archives > 2) { 260 vm_exit_during_initialization( 261 "Cannot have more than 2 archive files specified in the -XX:SharedArchiveFile option"); 262 } 263 264 if (num_archives == 1) { 265 const char* base_archive_path = nullptr; 266 bool success = 267 FileMapInfo::get_base_archive_name_from_header(SharedArchiveFile, &base_archive_path); 268 if (!success) { 269 // If +AutoCreateSharedArchive and the specified shared archive does not exist, 270 // regenerate the dynamic archive base on default archive. 271 if (AutoCreateSharedArchive && !os::file_exists(SharedArchiveFile)) { 272 enable_dumping_dynamic_archive(SharedArchiveFile); 273 FLAG_SET_ERGO(ArchiveClassesAtExit, SharedArchiveFile); 274 _input_static_archive_path = default_archive_path(); 275 FLAG_SET_ERGO(SharedArchiveFile, nullptr); 276 } else { 277 if (AutoCreateSharedArchive) { 278 warning("-XX:+AutoCreateSharedArchive is unsupported when base CDS archive is not loaded. Run with -Xlog:cds for more info."); 279 AutoCreateSharedArchive = false; 280 } 281 aot_log_error(aot)("Not a valid %s (%s)", type_of_archive_being_loaded(), SharedArchiveFile); 282 Arguments::no_shared_spaces("invalid archive"); 283 } 284 } else if (base_archive_path == nullptr) { 285 // User has specified a single archive, which is a static archive. 286 _input_static_archive_path = SharedArchiveFile; 287 } else { 288 // User has specified a single archive, which is a dynamic archive. 289 _input_dynamic_archive_path = SharedArchiveFile; 290 _input_static_archive_path = base_archive_path; // has been c-heap allocated. 291 } 292 } else { 293 extract_archive_paths(SharedArchiveFile, 294 &_input_static_archive_path, &_input_dynamic_archive_path); 295 if (_input_static_archive_path == nullptr) { 296 assert(_input_dynamic_archive_path == nullptr, "must be"); 297 Arguments::no_shared_spaces("invalid archive"); 298 } 299 } 300 301 if (_input_dynamic_archive_path != nullptr) { 302 // Check for case (c) 303 if (RecordDynamicDumpInfo) { 304 vm_exit_during_initialization("-XX:+RecordDynamicDumpInfo is unsupported when a dynamic CDS archive is specified in -XX:SharedArchiveFile", 305 SharedArchiveFile); 306 } 307 if (ArchiveClassesAtExit != nullptr) { 308 vm_exit_during_initialization("-XX:ArchiveClassesAtExit is unsupported when a dynamic CDS archive is specified in -XX:SharedArchiveFile", 309 SharedArchiveFile); 310 } 311 } 312 313 if (ArchiveClassesAtExit != nullptr && os::same_files(SharedArchiveFile, ArchiveClassesAtExit)) { 314 vm_exit_during_initialization( 315 "Cannot have the same archive file specified for -XX:SharedArchiveFile and -XX:ArchiveClassesAtExit", 316 SharedArchiveFile); 317 } 318 } 319 } 320 } 321 322 static char* bad_module_prop_key = nullptr; 323 static char* bad_module_prop_value = nullptr; 324 325 void CDSConfig::check_internal_module_property(const char* key, const char* value) { 326 if (Arguments::is_incompatible_cds_internal_module_property(key)) { 327 stop_using_optimized_module_handling(); 328 if (bad_module_prop_key == nullptr) { 329 // We don't want to print an unconditional warning here, as we are still processing the command line. 330 // A later argument may specify something like -Xshare:off, which makes such a warning irrelevant. 331 // 332 // Instead, we save the info so we can warn when necessary: we are doing it only during CacheDataStore 333 // creation for now, but could add it to other places. 334 bad_module_prop_key = os::strdup(key); 335 bad_module_prop_value = os::strdup(value); 336 } 337 aot_log_info(aot)("optimized module handling: disabled due to incompatible property: %s=%s", key, value); 338 } 339 } 340 341 void CDSConfig::check_incompatible_property(const char* key, const char* value) { 342 static const char* incompatible_properties[] = { 343 "java.system.class.loader", 344 "jdk.module.showModuleResolution", 345 "jdk.module.validation" 346 }; 347 348 for (const char* property : incompatible_properties) { 349 if (strcmp(key, property) == 0) { 350 stop_dumping_full_module_graph(); 351 stop_using_full_module_graph(); 352 aot_log_info(aot)("full module graph: disabled due to incompatible property: %s=%s", key, value); 353 break; 354 } 355 } 356 357 // Match the logic in java/lang/System.java, but we need to know this before the System class is initialized. 358 if (strcmp(key, "java.security.manager") == 0) { 359 if (strcmp(value, "disallowed") != 0) { 360 _is_security_manager_allowed = true; 361 } 362 } 363 } 364 365 // Returns any JVM command-line option, such as "--patch-module", that's not supported by CDS. 366 static const char* find_any_unsupported_module_option() { 367 // Note that arguments.cpp has translated the command-line options into properties. If we find an 368 // unsupported property, translate it back to its command-line option for better error reporting. 369 370 // The following properties are checked by Arguments::is_internal_module_property() and cannot be 371 // directly specified in the command-line. 372 static const char* unsupported_module_properties[] = { 373 "jdk.module.limitmods", 374 "jdk.module.upgrade.path", 375 "jdk.module.patch.0" 376 }; 377 static const char* unsupported_module_options[] = { 378 "--limit-modules", 379 "--upgrade-module-path", 380 "--patch-module" 381 }; 382 383 assert(ARRAY_SIZE(unsupported_module_properties) == ARRAY_SIZE(unsupported_module_options), "must be"); 384 SystemProperty* sp = Arguments::system_properties(); 385 while (sp != nullptr) { 386 for (uint i = 0; i < ARRAY_SIZE(unsupported_module_properties); i++) { 387 if (strcmp(sp->key(), unsupported_module_properties[i]) == 0) { 388 return unsupported_module_options[i]; 389 } 390 } 391 sp = sp->next(); 392 } 393 if (FLAG_IS_DEFAULT(AOTCache) && AOTStubCaching) { 394 log_debug(aot,codecache,init)("AOTCache is not specified - AOTStubCaching is ignored"); 395 } 396 397 return nullptr; // not found 398 } 399 400 void CDSConfig::check_unsupported_dumping_module_options() { 401 assert(is_dumping_archive(), "this function is only used with CDS dump time"); 402 const char* option = find_any_unsupported_module_option(); 403 if (option != nullptr) { 404 vm_exit_during_initialization("Cannot use the following option when dumping the shared archive", option); 405 } 406 // Check for an exploded module build in use with -Xshare:dump. 407 if (!Arguments::has_jimage()) { 408 vm_exit_during_initialization("Dumping the shared archive is not supported with an exploded module build"); 409 } 410 } 411 412 bool CDSConfig::has_unsupported_runtime_module_options() { 413 assert(is_using_archive(), "this function is only used with -Xshare:{on,auto}"); 414 if (ArchiveClassesAtExit != nullptr) { 415 // dynamic dumping, just return false for now. 416 // check_unsupported_dumping_properties() will be called later to check the same set of 417 // properties, and will exit the VM with the correct error message if the unsupported properties 418 // are used. 419 return false; 420 } 421 const char* option = find_any_unsupported_module_option(); 422 if (option != nullptr) { 423 if (RequireSharedSpaces) { 424 warning("CDS is disabled when the %s option is specified.", option); 425 } else { 426 if (new_aot_flags_used()) { 427 aot_log_warning(aot)("AOT cache is disabled when the %s option is specified.", option); 428 } else { 429 aot_log_info(aot)("CDS is disabled when the %s option is specified.", option); 430 } 431 } 432 return true; 433 } 434 return false; 435 } 436 437 #define CHECK_NEW_FLAG(f) check_new_flag(FLAG_IS_DEFAULT(f), #f) 438 439 void CDSConfig::check_new_flag(bool new_flag_is_default, const char* new_flag_name) { 440 if (old_cds_flags_used() && !new_flag_is_default) { 441 vm_exit_during_initialization(err_msg("Option %s cannot be used at the same time with " 442 "-Xshare:on, -Xshare:auto, -Xshare:off, -Xshare:dump, " 443 "DumpLoadedClassList, SharedClassListFile, or SharedArchiveFile", 444 new_flag_name)); 445 } 446 if (experimental_leyden_flags_used() && !new_flag_is_default) { 447 vm_exit_during_initialization(err_msg("Option %s cannot be used at the same time with " 448 "CacheDataStore, CDSManualFinalImage, or CDSPreimage", 449 new_flag_name)); 450 } 451 } 452 453 #define CHECK_SINGLE_PATH(f) check_flag_single_path(#f, f) 454 455 void CDSConfig::check_flag_single_path(const char* flag_name, const char* value) { 456 if (value != nullptr && num_archive_paths(value) != 1) { 457 vm_exit_during_initialization(err_msg("Option %s must specify a single file name", flag_name)); 458 } 459 } 460 461 void CDSConfig::check_aot_flags() { 462 if (!FLAG_IS_DEFAULT(DumpLoadedClassList) || 463 !FLAG_IS_DEFAULT(SharedClassListFile) || 464 !FLAG_IS_DEFAULT(SharedArchiveFile)) { 465 _old_cds_flags_used = true; 466 } 467 if (!FLAG_IS_DEFAULT(CacheDataStore) || 468 !FLAG_IS_DEFAULT(CDSManualFinalImage) || 469 !FLAG_IS_DEFAULT(CDSPreimage)) { 470 _experimental_leyden_flags_used = true; 471 } 472 473 // "New" AOT flags must not be mixed with "classic" CDS flags such as -Xshare:dump 474 CHECK_NEW_FLAG(AOTCache); 475 CHECK_NEW_FLAG(AOTCacheOutput); 476 CHECK_NEW_FLAG(AOTConfiguration); 477 CHECK_NEW_FLAG(AOTMode); 478 479 CHECK_SINGLE_PATH(AOTCache); 480 CHECK_SINGLE_PATH(AOTCacheOutput); 481 CHECK_SINGLE_PATH(AOTConfiguration); 482 483 if (FLAG_IS_DEFAULT(AOTCache) && 484 FLAG_IS_DEFAULT(AOTMode)) { 485 bool has_cache_output = !FLAG_IS_DEFAULT(AOTCacheOutput); 486 bool has_config = !FLAG_IS_DEFAULT(AOTConfiguration); 487 if (!has_cache_output && !has_config) { 488 // AOT flags are not used. Use classic CDS workflow 489 return; 490 } else if (has_cache_output) { 491 // If AOTCacheOutput has been set, default mode is "record". 492 // Default value for AOTConfiguration, if necessary, will be assigned in check_aotmode_record(). 493 FLAG_SET_ERGO(AOTMode, "record"); 494 } 495 } 496 if (FLAG_IS_DEFAULT(AOTCache) && AOTStubCaching) { 497 log_debug(aot,codecache,init)("AOTCache is not specified - AOTStubCaching is ignored"); 498 } 499 500 bool has_cache = !FLAG_IS_DEFAULT(AOTCache); 501 bool has_cache_output = !FLAG_IS_DEFAULT(AOTCacheOutput); 502 bool has_config = !FLAG_IS_DEFAULT(AOTConfiguration); 503 bool has_mode = !FLAG_IS_DEFAULT(AOTMode); 504 505 if (!has_cache && !has_cache_output && !has_config && !has_mode) { 506 // AOT flags are not used. Use classic CDS workflow 507 return; 508 } 509 510 if (has_cache && has_cache_output) { 511 vm_exit_during_initialization("Only one of AOTCache or AOTCacheOutput can be specified"); 512 } 513 514 if (!has_cache && (!has_mode || strcmp(AOTMode, "auto") == 0)) { 515 if (has_cache_output) { 516 // If AOTCacheOutput has been set, effective mode is "record". 517 // Default value for AOTConfiguration, if necessary, will be assigned in check_aotmode_record(). 518 log_info(aot)("Selected AOTMode=record because AOTCacheOutput is specified"); 519 FLAG_SET_ERGO(AOTMode, "record"); 520 } 521 } 522 523 // At least one AOT flag has been used 524 _new_aot_flags_used = true; 525 526 if (FLAG_IS_DEFAULT(AOTMode) || strcmp(AOTMode, "auto") == 0 || strcmp(AOTMode, "on") == 0) { 527 check_aotmode_auto_or_on(); 528 } else if (strcmp(AOTMode, "off") == 0) { 529 check_aotmode_off(); 530 } else if (strcmp(AOTMode, "record") == 0) { 531 check_aotmode_record(); 532 } else { 533 assert(strcmp(AOTMode, "create") == 0, "checked by AOTModeConstraintFunc"); 534 check_aotmode_create(); 535 } 536 537 // This is an old flag used by CDS regression testing only. It doesn't apply 538 // to the AOT workflow. 539 FLAG_SET_ERGO(AllowArchivingWithJavaAgent, false); 540 } 541 542 void CDSConfig::check_aotmode_off() { 543 UseSharedSpaces = false; 544 RequireSharedSpaces = false; 545 } 546 547 void CDSConfig::check_aotmode_auto_or_on() { 548 if (!FLAG_IS_DEFAULT(AOTConfiguration)) { 549 vm_exit_during_initialization(err_msg("AOTConfiguration can only be used with when AOTMode is record or create (selected AOTMode = %s)", 550 FLAG_IS_DEFAULT(AOTMode) ? "auto" : AOTMode)); 551 } 552 553 UseSharedSpaces = true; 554 if (FLAG_IS_DEFAULT(AOTMode) || (strcmp(AOTMode, "auto") == 0)) { 555 RequireSharedSpaces = false; 556 } else { 557 assert(strcmp(AOTMode, "on") == 0, "already checked"); 558 RequireSharedSpaces = true; 559 } 560 } 561 562 // %p substitution in AOTCache, AOTCacheOutput and AOTCacheConfiguration 563 static void substitute_aot_filename(JVMFlagsEnum flag_enum) { 564 JVMFlag* flag = JVMFlag::flag_from_enum(flag_enum); 565 const char* filename = flag->read<const char*>(); 566 assert(filename != nullptr, "must not have default value"); 567 568 // For simplicity, we don't allow %p/%t to be specified twice, because make_log_name() 569 // substitutes only the first occurrence. Otherwise, if we run with 570 // java -XX:AOTCacheOutput=%p%p.aot 571 // it will end up with both the pid of the training process and the assembly process. 572 const char* first_p = strstr(filename, "%p"); 573 if (first_p != nullptr && strstr(first_p + 2, "%p") != nullptr) { 574 vm_exit_during_initialization(err_msg("%s cannot contain more than one %%p", flag->name())); 575 } 576 const char* first_t = strstr(filename, "%t"); 577 if (first_t != nullptr && strstr(first_t + 2, "%t") != nullptr) { 578 vm_exit_during_initialization(err_msg("%s cannot contain more than one %%t", flag->name())); 579 } 580 581 // Note: with single-command training, %p will be the pid of the training process, not the 582 // assembly process. 583 const char* new_filename = make_log_name(filename, nullptr); 584 if (strcmp(filename, new_filename) != 0) { 585 JVMFlag::Error err = JVMFlagAccess::set_ccstr(flag, &new_filename, JVMFlagOrigin::ERGONOMIC); 586 assert(err == JVMFlag::SUCCESS, "must never fail"); 587 } 588 FREE_C_HEAP_ARRAY(char, new_filename); 589 } 590 591 void CDSConfig::check_aotmode_record() { 592 bool has_config = !FLAG_IS_DEFAULT(AOTConfiguration); 593 bool has_output = !FLAG_IS_DEFAULT(AOTCacheOutput); 594 595 if (!has_output && !has_config) { 596 vm_exit_during_initialization("At least one of AOTCacheOutput and AOTConfiguration must be specified when using -XX:AOTMode=record"); 597 } 598 599 if (has_output) { 600 _is_single_command_training = true; 601 substitute_aot_filename(FLAG_MEMBER_ENUM(AOTCacheOutput)); 602 if (!has_config) { 603 // Too early; can't use resource allocation yet. 604 size_t len = strlen(AOTCacheOutput) + 10; 605 char* temp = AllocateHeap(len, mtArguments); 606 jio_snprintf(temp, len, "%s.config", AOTCacheOutput); 607 FLAG_SET_ERGO(AOTConfiguration, temp); 608 FreeHeap(temp); 609 _has_temp_aot_config_file = true; 610 } 611 } 612 613 if (!FLAG_IS_DEFAULT(AOTCache)) { 614 vm_exit_during_initialization("AOTCache must not be specified when using -XX:AOTMode=record"); 615 } 616 617 substitute_aot_filename(FLAG_MEMBER_ENUM(AOTConfiguration)); 618 619 UseSharedSpaces = false; 620 RequireSharedSpaces = false; 621 _is_dumping_static_archive = true; 622 _is_dumping_preimage_static_archive = true; 623 624 // At VM exit, the module graph may be contaminated with program states. 625 // We will rebuild the module graph when dumping the CDS final image. 626 disable_heap_dumping(); 627 } 628 629 void CDSConfig::check_aotmode_create() { 630 if (FLAG_IS_DEFAULT(AOTConfiguration)) { 631 vm_exit_during_initialization("AOTConfiguration must be specified when using -XX:AOTMode=create"); 632 } 633 634 bool has_cache = !FLAG_IS_DEFAULT(AOTCache); 635 bool has_cache_output = !FLAG_IS_DEFAULT(AOTCacheOutput); 636 637 assert(!(has_cache && has_cache_output), "already checked"); 638 639 if (!has_cache && !has_cache_output) { 640 vm_exit_during_initialization("AOTCache or AOTCacheOutput must be specified when using -XX:AOTMode=create"); 641 } 642 643 if (!has_cache) { 644 precond(has_cache_output); 645 FLAG_SET_ERGO(AOTCache, AOTCacheOutput); 646 } 647 // No need to check for (!has_cache_output), as we don't look at AOTCacheOutput after here. 648 649 substitute_aot_filename(FLAG_MEMBER_ENUM(AOTCache)); 650 651 _is_dumping_final_static_archive = true; 652 UseSharedSpaces = true; 653 RequireSharedSpaces = true; 654 655 if (!FileMapInfo::is_preimage_static_archive(AOTConfiguration)) { 656 vm_exit_during_initialization("Must be a valid AOT configuration generated by the current JVM", AOTConfiguration); 657 } 658 659 CDSConfig::enable_dumping_static_archive(); 660 661 // We don't load any agents in the assembly phase, so we can ensure that the agents 662 // cannot affect the contents of the AOT cache. E.g., we don't want the agents to 663 // redefine any cached classes. We also don't want the agents to modify heap objects that 664 // are cached. 665 // 666 // Since application is not executed in the assembly phase, there's no need to load 667 // the agents anyway -- no one will notice that the agents are not loaded. 668 JvmtiAgentList::disable_agent_list(); 669 } 670 671 void CDSConfig::ergo_init_aot_paths() { 672 assert(_cds_ergo_initialize_started, "sanity"); 673 if (is_dumping_static_archive()) { 674 if (is_dumping_preimage_static_archive()) { 675 _output_archive_path = AOTConfiguration; 676 } else { 677 assert(is_dumping_final_static_archive(), "must be"); 678 _input_static_archive_path = AOTConfiguration; 679 _output_archive_path = AOTCache; 680 } 681 } else if (is_using_archive()) { 682 if (FLAG_IS_DEFAULT(AOTCache)) { 683 // Only -XX:AOTMode={auto,on} is specified 684 _input_static_archive_path = default_archive_path(); 685 } else { 686 _input_static_archive_path = AOTCache; 687 } 688 } 689 } 690 691 void CDSConfig::ergo_init_experimental_leyden_paths() { 692 assert(_cds_ergo_initialize_started, "sanity"); 693 if (is_dumping_static_archive()) { 694 if (is_dumping_preimage_static_archive()) { 695 _output_archive_path = CDSPreimage; 696 } else { 697 assert(is_dumping_final_static_archive(), "must be"); 698 _input_static_archive_path = CDSPreimage; 699 _output_archive_path = CacheDataStore; 700 } 701 } else if (is_using_archive()) { 702 _input_static_archive_path = CacheDataStore; 703 } 704 } 705 706 bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line, bool xshare_auto_cmd_line) { 707 assert(!_cds_ergo_initialize_started, "This is called earlier than CDSConfig::ergo_initialize()"); 708 709 check_aot_flags(); 710 711 if (!FLAG_IS_DEFAULT(AOTMode)) { 712 // Using any form of the new AOTMode switch enables enhanced optimizations. 713 FLAG_SET_ERGO_IF_DEFAULT(AOTClassLinking, true); 714 } 715 716 if (CacheDataStore != nullptr) { 717 if (!setup_experimental_leyden_workflow(xshare_auto_cmd_line)) { 718 return false; 719 } 720 } else { 721 if (CDSPreimage != nullptr) { 722 vm_exit_during_initialization("CDSPreimage must be specified only when CacheDataStore is specified"); 723 } 724 } 725 726 setup_compiler_args(); 727 728 if (AOTClassLinking) { 729 // If AOTClassLinking is specified, enable all these optimizations by default. 730 FLAG_SET_ERGO_IF_DEFAULT(AOTInvokeDynamicLinking, true); 731 FLAG_SET_ERGO_IF_DEFAULT(ArchiveDynamicProxies, true); 732 FLAG_SET_ERGO_IF_DEFAULT(ArchiveLoaderLookupCache, true); 733 FLAG_SET_ERGO_IF_DEFAULT(ArchivePackages, true); 734 FLAG_SET_ERGO_IF_DEFAULT(ArchiveProtectionDomains, true); 735 FLAG_SET_ERGO_IF_DEFAULT(ArchiveReflectionData, true); 736 } else { 737 // All of these *might* depend on AOTClassLinking. Better be safe than sorry. 738 FLAG_SET_ERGO(AOTInvokeDynamicLinking, false); 739 FLAG_SET_ERGO(ArchiveDynamicProxies, false); 740 FLAG_SET_ERGO(ArchiveLoaderLookupCache, false); 741 FLAG_SET_ERGO(ArchivePackages, false); 742 FLAG_SET_ERGO(ArchiveProtectionDomains, false); 743 FLAG_SET_ERGO(ArchiveReflectionData, false); 744 745 if (CDSConfig::is_dumping_archive()) { 746 FLAG_SET_ERGO(AOTRecordTraining, false); 747 FLAG_SET_ERGO(AOTReplayTraining, false); 748 AOTCodeCache::disable_caching(); 749 } 750 } 751 752 #ifdef _WINDOWS 753 // This optimization is not working on Windows for some reason. See JDK-8338604. 754 FLAG_SET_ERGO(ArchiveReflectionData, false); 755 #endif 756 757 if (is_dumping_static_archive()) { 758 if (is_dumping_preimage_static_archive() || is_dumping_final_static_archive()) { 759 // Don't tweak execution mode 760 } else if (!mode_flag_cmd_line) { 761 // By default, -Xshare:dump runs in interpreter-only mode, which is required for deterministic archive. 762 // 763 // If your classlist is large and you don't care about deterministic dumping, you can use 764 // -Xshare:dump -Xmixed to improve dumping speed. 765 Arguments::set_mode_flags(Arguments::_int); 766 } else if (Arguments::mode() == Arguments::_comp) { 767 // -Xcomp may use excessive CPU for the test tiers. Also, -Xshare:dump runs a small and fixed set of 768 // Java code, so there's not much benefit in running -Xcomp. 769 aot_log_info(aot)("reduced -Xcomp to -Xmixed for static dumping"); 770 Arguments::set_mode_flags(Arguments::_mixed); 771 } 772 773 // String deduplication may cause CDS to iterate the strings in different order from one 774 // run to another which resulting in non-determinstic CDS archives. 775 // Disable UseStringDeduplication while dumping CDS archive. 776 UseStringDeduplication = false; 777 } 778 779 // RecordDynamicDumpInfo is not compatible with ArchiveClassesAtExit 780 if (ArchiveClassesAtExit != nullptr && RecordDynamicDumpInfo) { 781 jio_fprintf(defaultStream::output_stream(), 782 "-XX:+RecordDynamicDumpInfo cannot be used with -XX:ArchiveClassesAtExit.\n"); 783 return false; 784 } 785 786 if (ArchiveClassesAtExit == nullptr && !RecordDynamicDumpInfo) { 787 disable_dumping_dynamic_archive(); 788 } else { 789 enable_dumping_dynamic_archive(ArchiveClassesAtExit); 790 } 791 792 if (AutoCreateSharedArchive) { 793 if (SharedArchiveFile == nullptr) { 794 aot_log_warning(aot)("-XX:+AutoCreateSharedArchive requires -XX:SharedArchiveFile"); 795 return false; 796 } 797 if (ArchiveClassesAtExit != nullptr) { 798 aot_log_warning(aot)("-XX:+AutoCreateSharedArchive does not work with ArchiveClassesAtExit"); 799 return false; 800 } 801 } 802 803 if (is_using_archive() && patch_mod_javabase) { 804 Arguments::no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched."); 805 } 806 if (is_using_archive() && has_unsupported_runtime_module_options()) { 807 UseSharedSpaces = false; 808 } 809 810 if (is_dumping_archive()) { 811 // Always verify non-system classes during CDS dump 812 if (!BytecodeVerificationRemote) { 813 BytecodeVerificationRemote = true; 814 aot_log_info(aot)("All non-system classes will be verified (-Xverify:remote) during CDS dump time."); 815 } 816 } 817 818 if (AOTClassLinking) { 819 if (is_dumping_final_static_archive() && !is_dumping_full_module_graph()) { 820 if (bad_module_prop_key != nullptr) { 821 log_warning(cds)("optimized module handling/full module graph: disabled due to incompatible property: %s=%s", 822 bad_module_prop_key, bad_module_prop_value); 823 } 824 if (is_experimental_leyden_workflow()) { 825 vm_exit_during_initialization("CacheDataStore cannot be created because AOTClassLinking is enabled but full module graph is disabled"); 826 } else { 827 vm_exit_during_initialization("AOT cache cannot be created because AOTClassLinking is enabled but full module graph is disabled"); 828 } 829 } 830 } 831 832 return true; 833 } 834 835 void CDSConfig::setup_compiler_args() { 836 // AOT profiles and AOT-compiled methods are supported only in the JEP 483 workflow. 837 bool can_dump_profile_and_compiled_code = AOTClassLinking && new_aot_flags_used(); 838 839 if (is_dumping_preimage_static_archive() && can_dump_profile_and_compiled_code) { 840 // JEP 483 workflow -- training 841 FLAG_SET_ERGO_IF_DEFAULT(AOTRecordTraining, true); 842 FLAG_SET_ERGO(AOTReplayTraining, false); 843 AOTCodeCache::disable_caching(); 844 } else if (is_dumping_final_static_archive() && can_dump_profile_and_compiled_code) { 845 // JEP 483 workflow -- assembly 846 FLAG_SET_ERGO(AOTRecordTraining, false); 847 FLAG_SET_ERGO_IF_DEFAULT(AOTReplayTraining, true); 848 AOTCodeCache::enable_caching(); 849 disable_dumping_aot_code(); // Cannot dump aot code until metadata and heap are dumped. 850 } else if (is_using_archive() && new_aot_flags_used()) { 851 // JEP 483 workflow -- production 852 FLAG_SET_ERGO(AOTRecordTraining, false); 853 FLAG_SET_ERGO_IF_DEFAULT(AOTReplayTraining, true); 854 AOTCodeCache::enable_caching(); 855 856 if (UseSharedSpaces && FLAG_IS_DEFAULT(AOTMode)) { 857 log_info(aot)("Enabled -XX:AOTMode=on by default for troubleshooting Leyden prototype"); 858 RequireSharedSpaces = true; 859 } 860 } else { 861 FLAG_SET_ERGO(AOTReplayTraining, false); 862 FLAG_SET_ERGO(AOTRecordTraining, false); 863 AOTCodeCache::disable_caching(); 864 } 865 } 866 867 // Ergo set-up of various flags used by the experimental workflow that uses -XX:CacheDataStore. This workflow 868 // is deprecated and will be removed from Leyden. 869 bool CDSConfig::setup_experimental_leyden_workflow(bool xshare_auto_cmd_line) { 870 if (FLAG_IS_DEFAULT(AOTClassLinking)) { 871 FLAG_SET_ERGO(AOTClassLinking, true); 872 } 873 874 if (SharedArchiveFile != nullptr) { 875 vm_exit_during_initialization("CacheDataStore and SharedArchiveFile cannot be both specified"); 876 } 877 if (!AOTClassLinking) { 878 vm_exit_during_initialization("CacheDataStore requires AOTClassLinking"); 879 } 880 881 if (CDSPreimage == nullptr) { 882 if (os::file_exists(CacheDataStore) /* && TODO: Need to check if CDS file is valid*/) { 883 // The CacheDataStore is already up to date. Use it. Also turn on aot code by default. 884 FLAG_SET_ERGO_IF_DEFAULT(AOTReplayTraining, true); 885 AOTCodeCache::enable_caching(); 886 887 // Leyden temp: make sure the user knows if CDS archive somehow fails to load. 888 if (UseSharedSpaces && !xshare_auto_cmd_line) { 889 log_info(cds)("Enabled -Xshare:on by default for troubleshooting Leyden prototype"); 890 RequireSharedSpaces = true; 891 } 892 } else { 893 // The preimage dumping phase -- run the app and write the preimage file 894 size_t len = strlen(CacheDataStore) + 10; 895 char* preimage = AllocateHeap(len, mtArguments); 896 jio_snprintf(preimage, len, "%s.preimage", CacheDataStore); 897 898 UseSharedSpaces = false; 899 enable_dumping_static_archive(); 900 CDSPreimage = preimage; 901 log_info(cds)("CacheDataStore needs to be updated. Writing %s file", CDSPreimage); 902 903 // At VM exit, the module graph may be contaminated with program states. We should rebuild the 904 // module graph when dumping the CDS final image. 905 log_info(cds)("full module graph: disabled when writing CDS preimage"); 906 disable_heap_dumping(); 907 stop_dumping_full_module_graph(); 908 FLAG_SET_ERGO(ArchivePackages, false); 909 FLAG_SET_ERGO(ArchiveProtectionDomains, false); 910 FLAG_SET_ERGO_IF_DEFAULT(AOTRecordTraining, true); 911 _is_dumping_static_archive = true; 912 _is_dumping_preimage_static_archive = true; 913 } 914 } else { 915 // The final image dumping phase -- load the preimage and write the final image file 916 UseSharedSpaces = true; 917 log_info(cds)("Generate CacheDataStore %s from CDSPreimage %s", CacheDataStore, CDSPreimage); 918 // Force -Xbatch for AOT compilation. 919 if (FLAG_SET_CMDLINE(BackgroundCompilation, false) != JVMFlag::SUCCESS) { 920 return false; 921 } 922 AOTRecordTraining = false; // This will be updated inside MetaspaceShared::preload_and_dump() 923 924 FLAG_SET_ERGO_IF_DEFAULT(AOTReplayTraining, true); 925 // Settings for AOT 926 AOTCodeCache::enable_caching(); // Update default settings 927 if (AOTCodeCache::is_caching_enabled()) { 928 // Cannot dump aot code until metadata and heap are dumped. 929 disable_dumping_aot_code(); 930 } 931 _is_dumping_static_archive = true; 932 _is_dumping_final_static_archive = true; 933 } 934 935 return true; 936 } 937 938 void CDSConfig::prepare_for_dumping() { 939 assert(CDSConfig::is_dumping_archive(), "sanity"); 940 941 if (is_dumping_dynamic_archive() && !is_using_archive()) { 942 assert(!is_dumping_static_archive(), "cannot be dumping both static and dynamic archives"); 943 944 // This could happen if SharedArchiveFile has failed to load: 945 // - -Xshare:off was specified 946 // - SharedArchiveFile points to an non-existent file. 947 // - SharedArchiveFile points to an archive that has failed CRC check 948 // - SharedArchiveFile is not specified and the VM doesn't have a compatible default archive 949 950 #define __THEMSG " is unsupported when base CDS archive is not loaded. Run with -Xlog:cds for more info." 951 if (RecordDynamicDumpInfo) { 952 aot_log_error(aot)("-XX:+RecordDynamicDumpInfo%s", __THEMSG); 953 MetaspaceShared::unrecoverable_loading_error(); 954 } else { 955 assert(ArchiveClassesAtExit != nullptr, "sanity"); 956 aot_log_warning(aot)("-XX:ArchiveClassesAtExit" __THEMSG); 957 } 958 #undef __THEMSG 959 disable_dumping_dynamic_archive(); 960 return; 961 } 962 963 check_unsupported_dumping_module_options(); 964 } 965 966 bool CDSConfig::is_dumping_classic_static_archive() { 967 return _is_dumping_static_archive && 968 !is_dumping_preimage_static_archive() && 969 !is_dumping_final_static_archive(); 970 } 971 972 bool CDSConfig::is_dumping_preimage_static_archive() { 973 return _is_dumping_preimage_static_archive; 974 } 975 976 bool CDSConfig::is_dumping_preimage_static_archive_with_triggers() { 977 return (!FLAG_IS_DEFAULT(AOTEndTrainingOnMethodEntry)) && is_dumping_preimage_static_archive(); 978 } 979 980 bool CDSConfig::is_dumping_final_static_archive() { 981 return _is_dumping_final_static_archive; 982 } 983 984 void CDSConfig::enable_dumping_dynamic_archive(const char* output_path) { 985 _is_dumping_dynamic_archive = true; 986 if (output_path == nullptr) { 987 // output_path can be null when the VM is started with -XX:+RecordDynamicDumpInfo 988 // in anticipation of "jcmd VM.cds dynamic_dump", which will provide the actual 989 // output path. 990 _output_archive_path = nullptr; 991 } else { 992 _output_archive_path = os::strdup_check_oom(output_path, mtArguments); 993 } 994 } 995 996 bool CDSConfig::allow_only_single_java_thread() { 997 // See comments in JVM_StartThread() 998 return is_dumping_classic_static_archive() || is_dumping_final_static_archive(); 999 } 1000 1001 bool CDSConfig::is_logging_dynamic_proxies() { 1002 return ClassListWriter::is_enabled() || is_dumping_preimage_static_archive(); 1003 } 1004 1005 // Preserve all states that were examined used during dumptime verification, such 1006 // that the verification result (pass or fail) cannot be changed at runtime. 1007 // 1008 // For example, if the verification of ik requires that class A must be a subtype of B, 1009 // then this relationship between A and B cannot be changed at runtime. I.e., the app 1010 // cannot load alternative versions of A and B such that A is not a subtype of B. 1011 bool CDSConfig::preserve_all_dumptime_verification_states(const InstanceKlass* ik) { 1012 return is_dumping_aot_linked_classes() && SystemDictionaryShared::is_builtin(ik); 1013 } 1014 1015 bool CDSConfig::is_using_archive() { 1016 return UseSharedSpaces; 1017 } 1018 1019 bool CDSConfig::is_using_only_default_archive() { 1020 return is_using_archive() && 1021 input_static_archive_path() != nullptr && 1022 default_archive_path() != nullptr && 1023 strcmp(input_static_archive_path(), default_archive_path()) == 0 && 1024 input_dynamic_archive_path() == nullptr; 1025 } 1026 1027 bool CDSConfig::is_logging_lambda_form_invokers() { 1028 return ClassListWriter::is_enabled() || is_dumping_dynamic_archive() || is_dumping_preimage_static_archive(); 1029 } 1030 1031 bool CDSConfig::is_dumping_regenerated_lambdaform_invokers() { 1032 if (is_dumping_final_static_archive()) { 1033 // No need to regenerate -- the lambda form invokers should have been regenerated 1034 // in the preimage archive (if allowed) 1035 return false; 1036 } else if (is_dumping_dynamic_archive() && is_using_aot_linked_classes()) { 1037 // The base archive has aot-linked classes that may have AOT-resolved CP references 1038 // that point to the lambda form invokers in the base archive. Such pointers will 1039 // be invalid if lambda form invokers are regenerated in the dynamic archive. 1040 return false; 1041 } else if (CDSConfig::is_dumping_method_handles()) { 1042 // Work around JDK-8310831, as some methods in lambda form holder classes may not get generated. 1043 return false; 1044 } else { 1045 return is_dumping_archive(); 1046 } 1047 } 1048 1049 void CDSConfig::stop_using_optimized_module_handling() { 1050 _is_using_optimized_module_handling = false; 1051 _is_dumping_full_module_graph = false; // This requires is_using_optimized_module_handling() 1052 _is_using_full_module_graph = false; // This requires is_using_optimized_module_handling() 1053 } 1054 1055 1056 CDSConfig::DumperThreadMark::DumperThreadMark(JavaThread* current) { 1057 assert(_dumper_thread == nullptr, "sanity"); 1058 _dumper_thread = current; 1059 } 1060 1061 CDSConfig::DumperThreadMark::~DumperThreadMark() { 1062 assert(_dumper_thread != nullptr, "sanity"); 1063 _dumper_thread = nullptr; 1064 } 1065 1066 bool CDSConfig::current_thread_is_vm_or_dumper() { 1067 Thread* t = Thread::current(); 1068 return t != nullptr && (t->is_VM_thread() || t == _dumper_thread); 1069 } 1070 1071 const char* CDSConfig::type_of_archive_being_loaded() { 1072 if (is_dumping_final_static_archive()) { 1073 return "AOT configuration file"; 1074 } else if (new_aot_flags_used()) { 1075 return "AOT cache"; 1076 } else { 1077 return "shared archive file"; 1078 } 1079 } 1080 1081 const char* CDSConfig::type_of_archive_being_written() { 1082 if (is_dumping_preimage_static_archive()) { 1083 return "AOT configuration file"; 1084 } else if (new_aot_flags_used()) { 1085 return "AOT cache"; 1086 } else { 1087 return "shared archive file"; 1088 } 1089 } 1090 1091 // If an incompatible VM options is found, return a text message that explains why 1092 static const char* check_options_incompatible_with_dumping_heap() { 1093 #if INCLUDE_CDS_JAVA_HEAP 1094 if (!UseCompressedClassPointers) { 1095 return "UseCompressedClassPointers must be true"; 1096 } 1097 1098 // Almost all GCs support heap region dump, except ZGC (so far). 1099 if (UseZGC) { 1100 return "ZGC is not supported"; 1101 } 1102 1103 return nullptr; 1104 #else 1105 return "JVM not configured for writing Java heap objects"; 1106 #endif 1107 } 1108 1109 void CDSConfig::log_reasons_for_not_dumping_heap() { 1110 const char* reason; 1111 1112 assert(!is_dumping_heap(), "sanity"); 1113 1114 if (_disable_heap_dumping) { 1115 reason = "Programmatically disabled"; 1116 } else { 1117 reason = check_options_incompatible_with_dumping_heap(); 1118 } 1119 1120 assert(reason != nullptr, "sanity"); 1121 aot_log_info(aot)("Archived java heap is not supported: %s", reason); 1122 } 1123 1124 // This is *Legacy* optimization for lambdas before JEP 483. May be removed in the future. 1125 bool CDSConfig::is_dumping_lambdas_in_legacy_mode() { 1126 return !is_dumping_method_handles(); 1127 } 1128 1129 #if INCLUDE_CDS_JAVA_HEAP 1130 bool CDSConfig::are_vm_options_incompatible_with_dumping_heap() { 1131 return check_options_incompatible_with_dumping_heap() != nullptr; 1132 } 1133 1134 bool CDSConfig::is_dumping_heap() { 1135 if (!(is_dumping_classic_static_archive() || is_dumping_final_static_archive()) 1136 || are_vm_options_incompatible_with_dumping_heap() 1137 || _disable_heap_dumping) { 1138 return false; 1139 } 1140 return true; 1141 } 1142 1143 bool CDSConfig::is_loading_heap() { 1144 return ArchiveHeapLoader::is_in_use(); 1145 } 1146 1147 bool CDSConfig::is_using_full_module_graph() { 1148 if (ClassLoaderDataShared::is_full_module_graph_loaded()) { 1149 return true; 1150 } 1151 1152 if (!_is_using_full_module_graph) { 1153 return false; 1154 } 1155 1156 if (is_using_archive() && ArchiveHeapLoader::can_use()) { 1157 // Classes used by the archived full module graph are loaded in JVMTI early phase. 1158 assert(!(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env()), 1159 "CDS should be disabled if early class hooks are enabled"); 1160 return true; 1161 } else { 1162 _is_using_full_module_graph = false; 1163 return false; 1164 } 1165 } 1166 1167 void CDSConfig::stop_dumping_full_module_graph(const char* reason) { 1168 if (_is_dumping_full_module_graph) { 1169 _is_dumping_full_module_graph = false; 1170 if (reason != nullptr) { 1171 aot_log_info(aot)("full module graph cannot be dumped: %s", reason); 1172 } 1173 } 1174 } 1175 1176 void CDSConfig::stop_using_full_module_graph(const char* reason) { 1177 assert(!ClassLoaderDataShared::is_full_module_graph_loaded(), "you call this function too late!"); 1178 if (_is_using_full_module_graph) { 1179 _is_using_full_module_graph = false; 1180 if (reason != nullptr) { 1181 aot_log_info(aot)("full module graph cannot be loaded: %s", reason); 1182 } 1183 } 1184 } 1185 1186 bool CDSConfig::is_dumping_aot_linked_classes() { 1187 if (is_dumping_preimage_static_archive()) { 1188 return false; 1189 } else if (is_dumping_dynamic_archive()) { 1190 return is_using_full_module_graph() && AOTClassLinking; 1191 } else if (is_dumping_static_archive()) { 1192 return is_dumping_full_module_graph() && AOTClassLinking; 1193 } else { 1194 return false; 1195 } 1196 } 1197 1198 bool CDSConfig::is_using_aot_linked_classes() { 1199 // Make sure we have the exact same module graph as in the assembly phase, or else 1200 // some aot-linked classes may not be visible so cannot be loaded. 1201 return is_using_full_module_graph() && _has_aot_linked_classes; 1202 } 1203 1204 bool CDSConfig::is_dumping_dynamic_proxies() { 1205 return is_dumping_full_module_graph() && is_dumping_invokedynamic() && ArchiveDynamicProxies; 1206 } 1207 1208 void CDSConfig::set_has_aot_linked_classes(bool has_aot_linked_classes) { 1209 _has_aot_linked_classes |= has_aot_linked_classes; 1210 } 1211 1212 bool CDSConfig::is_initing_classes_at_dump_time() { 1213 return is_dumping_heap() && is_dumping_aot_linked_classes(); 1214 } 1215 1216 bool CDSConfig::is_dumping_invokedynamic() { 1217 // Requires is_dumping_aot_linked_classes(). Otherwise the classes of some archived heap 1218 // objects used by the archive indy callsites may be replaced at runtime. 1219 return AOTInvokeDynamicLinking && is_dumping_aot_linked_classes() && is_dumping_heap(); 1220 } 1221 1222 bool CDSConfig::is_dumping_packages() { 1223 return ArchivePackages && is_dumping_heap(); 1224 } 1225 1226 bool CDSConfig::is_loading_packages() { 1227 return UseSharedSpaces && is_using_full_module_graph() && _is_loading_packages; 1228 } 1229 1230 bool CDSConfig::is_dumping_protection_domains() { 1231 if (_is_security_manager_allowed) { 1232 // For sanity, don't archive PDs. TODO: can this be relaxed? 1233 return false; 1234 } 1235 // Archived PDs for the modules will reference their java.lang.Module, which must 1236 // also be archived. 1237 return ArchiveProtectionDomains && is_dumping_full_module_graph(); 1238 } 1239 1240 bool CDSConfig::is_loading_protection_domains() { 1241 if (_is_security_manager_allowed) { 1242 // For sanity, don't used any archived PDs. TODO: can this be relaxed? 1243 return false; 1244 } 1245 return UseSharedSpaces && is_using_full_module_graph() && _is_loading_protection_domains; 1246 } 1247 1248 bool CDSConfig::is_dumping_reflection_data() { 1249 // reflection data use LambdaForm classes 1250 return ArchiveReflectionData && is_dumping_invokedynamic(); 1251 } 1252 1253 // When we are dumping aot-linked classes and we are able to write archived heap objects, we automatically 1254 // enable the archiving of MethodHandles. This will in turn enable the archiving of MethodTypes and hidden 1255 // classes that are used in the implementation of MethodHandles. 1256 // Archived MethodHandles are required for higher-level optimizations such as AOT resolution of invokedynamic 1257 // and dynamic proxies. 1258 bool CDSConfig::is_dumping_method_handles() { 1259 return is_initing_classes_at_dump_time(); 1260 } 1261 1262 #endif // INCLUDE_CDS_JAVA_HEAP 1263 1264 // AOT code generation and its archiving is disabled by default. 1265 // We enable it only in the final image dump after the metadata and heap are dumped. 1266 // This affects only JITed code because it may have embedded oops and metadata pointers 1267 // which AOT code encodes as offsets in final CDS archive regions. 1268 1269 static bool _is_dumping_aot_code = false; 1270 1271 bool CDSConfig::is_dumping_aot_code() { 1272 return _is_dumping_aot_code; 1273 } 1274 1275 void CDSConfig::disable_dumping_aot_code() { 1276 _is_dumping_aot_code = false; 1277 } 1278 1279 void CDSConfig::enable_dumping_aot_code() { 1280 _is_dumping_aot_code = true; 1281 } 1282 1283 bool CDSConfig::is_experimental_leyden_workflow() { 1284 return CacheDataStore != nullptr || CDSPreimage != nullptr; 1285 } 1286 1287 bool CDSConfig::is_dumping_adapters() { 1288 return (AOTAdapterCaching && is_dumping_final_static_archive()); 1289 }