# HG changeset patch # User redestad # Date 1544015381 -3600 # Wed Dec 05 14:09:41 2018 +0100 # Node ID 9e38334c6f66f18ece58730975e44abc7511b30a # Parent cd19c580ba9c291a2a7b4095efc1d6440d61b2c9 8214858: Improve module graph archiving Reviewed-by: alanb diff --git a/src/hotspot/share/memory/heapShared.cpp b/src/hotspot/share/memory/heapShared.cpp --- a/src/hotspot/share/memory/heapShared.cpp +++ b/src/hotspot/share/memory/heapShared.cpp @@ -71,10 +71,7 @@ }; // Entry fields for subgraphs archived in the open archive heap region. static ArchivableStaticFieldInfo open_archive_subgraph_entry_fields[] = { - {"jdk/internal/module/ArchivedModuleGraph", "archivedSystemModules"}, - {"jdk/internal/module/ArchivedModuleGraph", "archivedModuleFinder"}, - {"jdk/internal/module/ArchivedModuleGraph", "archivedMainModule"}, - {"jdk/internal/module/ArchivedModuleGraph", "archivedConfiguration"}, + {"jdk/internal/module/ArchivedModuleGraph", "archivedModuleGraph"}, {"java/util/ImmutableCollections$ListN", "EMPTY_LIST"}, {"java/util/ImmutableCollections$MapN", "EMPTY_MAP"}, {"java/util/ImmutableCollections$SetN", "EMPTY_SET"}, diff --git a/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java b/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java --- a/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java +++ b/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java @@ -27,32 +27,40 @@ import java.lang.module.Configuration; import java.lang.module.ModuleFinder; +import java.util.Map; import java.util.Objects; +import java.util.Set; + import jdk.internal.misc.VM; /** * Used by ModuleBootstrap to obtain the archived system modules and finder. */ final class ArchivedModuleGraph { - private static String archivedMainModule; - private static SystemModules archivedSystemModules; - private static ModuleFinder archivedModuleFinder; - private static Configuration archivedConfiguration; + private static ArchivedModuleGraph archivedModuleGraph; - private final SystemModules systemModules; + private final String mainModule; + private final boolean hasSplitPackages; + private final boolean hasIncubatorModules; private final ModuleFinder finder; private final Configuration configuration; + private final Map> concealedPackagesToOpen; + private final Map> exportedPackagesToOpen; - private ArchivedModuleGraph(SystemModules modules, + private ArchivedModuleGraph(String mainModule, + boolean hasSplitPackages, + boolean hasIncubatorModules, ModuleFinder finder, - Configuration configuration) { - this.systemModules = modules; + Configuration configuration, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen) { + this.mainModule = mainModule; + this.hasSplitPackages = hasSplitPackages; + this.hasIncubatorModules = hasIncubatorModules; this.finder = finder; this.configuration = configuration; - } - - SystemModules systemModules() { - return systemModules; + this.concealedPackagesToOpen = concealedPackagesToOpen; + this.exportedPackagesToOpen = exportedPackagesToOpen; } ModuleFinder finder() { @@ -63,32 +71,54 @@ return configuration; } - // A factory method that ModuleBootstrap can use to obtain the - // ArchivedModuleGraph. + Map> concealedPackagesToOpen() { + return concealedPackagesToOpen; + } + + Map> exportedPackagesToOpen() { + return exportedPackagesToOpen; + } + + boolean hasSplitPackages() { + return hasSplitPackages; + } + + boolean hasIncubatorModules() { + return hasIncubatorModules; + } + + /** + * Returns the ArchivedModuleGraph for the given initial module. + */ static ArchivedModuleGraph get(String mainModule) { - if (Objects.equals(mainModule, archivedMainModule) - && archivedSystemModules != null - && archivedModuleFinder != null - && archivedConfiguration != null) { - return new ArchivedModuleGraph(archivedSystemModules, - archivedModuleFinder, - archivedConfiguration); + ArchivedModuleGraph graph = archivedModuleGraph; + if (graph != null && Objects.equals(mainModule, graph.mainModule)) { + return graph; } else { return null; } } - // Used at CDS dump time + /** + * Archive the module graph for the given initial module. + */ static void archive(String mainModule, - SystemModules systemModules, + boolean hasSplitPackages, + boolean hasIncubatorModules, ModuleFinder finder, - Configuration configuration) { - if (archivedMainModule != null) + Configuration configuration, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen) { + if (mainModule != null) { throw new UnsupportedOperationException(); - archivedMainModule = mainModule; - archivedSystemModules = systemModules; - archivedModuleFinder = finder; - archivedConfiguration = configuration; + } + archivedModuleGraph = new ArchivedModuleGraph(mainModule, + hasSplitPackages, + hasIncubatorModules, + finder, + configuration, + concealedPackagesToOpen, + exportedPackagesToOpen); } static { diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java --- a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java @@ -172,6 +172,8 @@ boolean haveModulePath = (appModulePath != null || upgradeModulePath != null); boolean needResolution = true; boolean canArchive = false; + boolean hasSplitPackages; + boolean hasIncubatorModules; // If the java heap was archived at CDS dump time and the environment // at dump time matches the current environment then use the archived @@ -182,8 +184,9 @@ && addModules.isEmpty() && limitModules.isEmpty() && !isPatched) { - systemModules = archivedModuleGraph.systemModules(); systemModuleFinder = archivedModuleGraph.finder(); + hasSplitPackages = archivedModuleGraph.hasSplitPackages(); + hasIncubatorModules = archivedModuleGraph.hasIncubatorModules(); needResolution = (traceOutput != null); } else { if (!haveModulePath && addModules.isEmpty() && limitModules.isEmpty()) { @@ -205,6 +208,11 @@ systemModules = new ExplodedSystemModules(); systemModuleFinder = SystemModuleFinders.ofSystem(); } + + hasSplitPackages = systemModules.hasSplitPackages(); + hasIncubatorModules = systemModules.hasIncubatorModules(); + // not using the archived module graph - avoid accidental use + archivedModuleGraph = null; } Counters.add("jdk.module.boot.1.systemModulesTime", t1); @@ -395,7 +403,7 @@ } // check for split packages in the modules mapped to the built-in loaders - if (systemModules.hasSplitPackages() || isPatched || haveModulePath) { + if (hasSplitPackages || isPatched || haveModulePath) { checkSplitPackages(cf, clf); } @@ -415,7 +423,7 @@ // Step 7: Miscellaneous // check incubating status - if (systemModules.hasIncubatorModules() || haveModulePath) { + if (hasIncubatorModules || haveModulePath) { checkIncubatingStatus(cf); } @@ -423,7 +431,21 @@ long t7 = System.nanoTime(); addExtraReads(bootLayer); boolean extraExportsOrOpens = addExtraExportsAndOpens(bootLayer); - addIllegalAccess(upgradeModulePath, systemModules, bootLayer, extraExportsOrOpens); + + Map> concealedPackagesToOpen; + Map> exportedPackagesToOpen; + if (archivedModuleGraph != null) { + concealedPackagesToOpen = archivedModuleGraph.concealedPackagesToOpen(); + exportedPackagesToOpen = archivedModuleGraph.exportedPackagesToOpen(); + } else { + concealedPackagesToOpen = systemModules.concealedPackagesToOpen(); + exportedPackagesToOpen = systemModules.exportedPackagesToOpen(); + } + addIllegalAccess(upgradeModulePath, + concealedPackagesToOpen, + exportedPackagesToOpen, + bootLayer, + extraExportsOrOpens); Counters.add("jdk.module.boot.7.adjustModulesTime", t7); // save module finders for later use @@ -436,8 +458,13 @@ // Module graph can be archived at CDS dump time. Only allow the // unnamed module case for now. if (canArchive && (mainModule == null)) { - ArchivedModuleGraph.archive(mainModule, systemModules, - systemModuleFinder, cf); + ArchivedModuleGraph.archive(mainModule, + hasSplitPackages, + hasIncubatorModules, + systemModuleFinder, + cf, + concealedPackagesToOpen, + exportedPackagesToOpen); } // total time to initialize @@ -738,7 +765,8 @@ * of system modules in the boot layer to code in unnamed modules. */ private static void addIllegalAccess(ModuleFinder upgradeModulePath, - SystemModules systemModules, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen, ModuleLayer bootLayer, boolean extraExportsOrOpens) { String value = getAndRemoveProperty("jdk.module.illegalAccess"); @@ -764,13 +792,11 @@ IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(mode, System.err); - Map> map1 = systemModules.concealedPackagesToOpen(); - Map> map2 = systemModules.exportedPackagesToOpen(); - if (map1.isEmpty() && map2.isEmpty()) { + if (concealedPackagesToOpen.isEmpty() && exportedPackagesToOpen.isEmpty()) { // need to generate (exploded build) IllegalAccessMaps maps = IllegalAccessMaps.generate(limitedFinder()); - map1 = maps.concealedPackagesToOpen(); - map2 = maps.exportedPackagesToOpen(); + concealedPackagesToOpen = maps.concealedPackagesToOpen(); + exportedPackagesToOpen = maps.exportedPackagesToOpen(); } // open specific packages in the system modules @@ -789,8 +815,8 @@ continue; } - Set concealedPackages = map1.getOrDefault(name, Set.of()); - Set exportedPackages = map2.getOrDefault(name, Set.of()); + Set concealedPackages = concealedPackagesToOpen.getOrDefault(name, Set.of()); + Set exportedPackages = exportedPackagesToOpen.getOrDefault(name, Set.of()); // refresh the set of concealed and exported packages if needed if (extraExportsOrOpens) {