diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index df55639d814..33686a3b6e9 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -131,6 +131,9 @@ char* Arguments::_ext_dirs = nullptr; // True if -Xshare:auto option was specified. static bool xshare_auto_cmd_line = false; +// True if -Xint/-Xmixed/-Xcomp were specified +static bool mode_flag_cmd_line = false; + bool PathString::set_value(const char *value, AllocFailType alloc_failmode) { char* new_value = AllocateHeap(strlen(value)+1, mtArguments, alloc_failmode); if (new_value == nullptr) { @@ -2600,13 +2603,16 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m // -Xint } else if (match_option(option, "-Xint")) { set_mode_flags(_int); + mode_flag_cmd_line = true; // -Xmixed } else if (match_option(option, "-Xmixed")) { set_mode_flags(_mixed); + mode_flag_cmd_line = true; // -Xcomp } else if (match_option(option, "-Xcomp")) { // for testing the compiler; turn off all flags that inhibit compilation set_mode_flags(_comp); + mode_flag_cmd_line = true; // -Xshare:dump } else if (match_option(option, "-Xshare:dump")) { DumpSharedSpaces = true; @@ -3031,14 +3037,18 @@ jint Arguments::finalize_vm_init_args(bool patch_mod_javabase) { #if INCLUDE_CDS if (DumpSharedSpaces) { - // Compiler threads may concurrently update the class metadata (such as method entries), so it's - // unsafe with -Xshare:dump (which modifies the class metadata in place). Let's disable - // compiler just to be safe. - // - // Note: this is not a concern for dynamically dumping shared spaces, which makes a copy of the - // class metadata instead of modifying them in place. The copy is inaccessible to the compiler. - // TODO: revisit the following for the static archive case. - set_mode_flags(_int); + if (!mode_flag_cmd_line) { + // By default, -Xshare:dump runs in interpreter-only mode, which is required for deterministic archive. + // + // If your classlist is large and you don't care about deterministic dumping, you can use + // -Xshare:dump -Xmixed to improve dumping speed. + set_mode_flags(_int); + } else if (_mode == _comp) { + // -Xcomp may use excessive CPU for the test tiers. Also, -Xshare:dump runs a small and fixed set of + // Java code, so there's not much benefit in running -Xcomp. + log_info(cds)("reduced -Xcomp to -Xmixed for static dumping"); + set_mode_flags(_mixed); + } // String deduplication may cause CDS to iterate the strings in different order from one // run to another which resulting in non-determinstic CDS archives. diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index a72da6d7c11..ece26077424 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -5069,6 +5069,18 @@ The output of this command should contain the following text: \f[V][info][class,load] test.Hello source: shared objects file\f[R] .RE .RE +.PP +By default, when the \f[V]-Xshare:dump\f[R] option is used, the JVM runs +in interpreter-only mode (as if the \f[V]-Xint\f[R] option were +specified). +This is required for generating deterministic output in the shared +archive file. +I.e., the exact same archive will be generated, bit-for-bit, every time +you dump it. +However, if deterministic output is not needed, and you have a large +classlist, you can explicitly add \f[V]-Xmixed\f[R] to the command-line +to enable the JIT compiler. +This will speed up the archive creation. .SS Creating a Dynamic CDS Archive File with -XX:ArchiveClassesAtExit .PP Advantages of dynamic CDS archives are: diff --git a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java index 57e4000fe7a..8f9bb4a5829 100644 --- a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java +++ b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java @@ -79,6 +79,7 @@ public class DeterministicDump { String archiveName = logName + ".jsa"; String mapName = logName + ".map"; CDSOptions opts = (new CDSOptions()) + .addPrefix("-Xint") // Override any -Xmixed/-Xcomp flags from jtreg -vmoptions .addPrefix("-Xlog:cds=debug") .addPrefix("-Xlog:cds+map*=trace:file=" + mapName + ":none:filesize=0") .setArchiveName(archiveName) diff --git a/test/hotspot/jtreg/runtime/cds/appcds/CommandLineFlagCombo.java b/test/hotspot/jtreg/runtime/cds/appcds/CommandLineFlagCombo.java index baf59d02fed..7b4a03850b8 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/CommandLineFlagCombo.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/CommandLineFlagCombo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,10 @@ public class CommandLineFlagCombo { "-XX:+UseCompressedOops", "-XX:ObjectAlignmentInBytes=16", "-XX:ObjectAlignmentInBytes=32", - "-XX:ObjectAlignmentInBytes=64" + "-XX:ObjectAlignmentInBytes=64", + "-Xint", + "-Xmixed", + "-Xcomp", }; public static void main(String[] args) throws Exception {