> On Jul 6, 2018, at 1:36 PM, Ioi Lam <ioi....@oracle.com> wrote: > > Hi Jiangli, > > The VM changes look good to me.
Thanks! > > For the tests: I think we need a comment here saying that "mods" is > intentionally empty, and also an explanation why it's not necessary to > actually fill with actual modules? Will do. Thanks, Jiangli > > Thanks > > - Ioi > > >>> 3) ArchivedModuleComboTest.java >>> >>> 55 Path moduleDir = Files.createTempDirectory(userDir, "mods"); >>> >>> I don't see anything got placed under the "mods" dir, is it by design? >> Yes. >> > > > On 7/6/18 12:34 PM, Jiangli Zhou wrote: >> Hi Calvin, >> >> Thanks for the review! Here is the updated webrevs that address the >> feedbacks from you and Ioi: >> >> http://cr.openjdk.java.net/~jiangli/8202035/webrev_inc.01/ >> >> Full webrev: http://cr.openjdk.java.net/~jiangli/8202035/webrev_full.01/ >> >>> On Jul 6, 2018, at 9:15 AM, Calvin Cheung <calvin.che...@oracle.com> wrote: >>> >>> Hi Jiangli, >>> >>> Thanks for this start-up improvement. The changes look good overall. I've >>> the following minor comments. >>> >>> 1) make/hotspot/symbols/symbols-unix >>> >>> 134 JVM_InitializeFromArchive >>> >>> If you want the symbols to be in alphabetical order, the above should be >>> moved after JVM_InitStackTraceElementArray. >> Fixed. >> >>> 2) metaspaceShared.cpp >>> >>> 1927 oop MetaspaceShared::materialize_archived_object(oop obj) { >>> 1928 if (obj != NULL) { >>> 1929 return >>> G1CollectedHeap::heap()->materialize_archived_object(obj); >>> 1930 } >>> 1931 return NULL; >>> 1932 } >>> >>> Instead of two return statements, how about replacing lines 1928 - 1931 >>> with the following? >>> >>> return (obj != NULL) ? >>> G1CollectedHeap::heap()->materialize_archived_object(obj) : NULL; >> The original format probably is slightly easier to read, so I left it >> unchanged. Hope that’s okay with you. >> >>> 3) ArchivedModuleComboTest.java >>> >>> 55 Path moduleDir = Files.createTempDirectory(userDir, "mods"); >>> >>> I don't see anything got placed under the "mods" dir, is it by design? >> Yes. >> >>> For the "dump with --module-path" cases, there seems to be a missing test >>> case with "--show-module-resolution" (similar to Test case 2). >> When --module-path is specified at dump time, system module graph is not >> archived currently. There is no need for additional test case with >> --show-module-resolution in this case since all module objects are created >> as normal. >> >>> >>> 4) CheckArchivedModuleApp.java >>> >>> 53 if (expectArchived && wb.isShared(md)) { >>> 54 System.out.println(name + " is archived. Expected."); >>> 55 } else if (!expectArchived && !wb.isShared(md)) { >>> 56 System.out.println(name + " is not archived. >>> Expected."); >>> 57 } else if (expectArchived) { >>> 58 throw new RuntimeException( >>> 59 "FAILED. " + name + " is not archived. Expect >>> archived."); >>> 60 } else { >>> 61 throw new RuntimeException( >>> 62 "FAILED. " + name + " is archived. Expect not >>> archived."); >>> 63 } >>> >>> I'd suggest the following so that the code is easier to understand: >>> >>> if (expectArchived) { >>> if (wb.isShared(md)) { >>> System.out.println(name + " is archived. Expected."); >>> } else { >>> throw new RuntimeException( >>> "FAILED. " + name + " is not archived. Expect archived."); >>> } >>> } else { >>> if (!wb.isShared(md)) { >>> System.out.println(name + " is not archived. Expected."); >>> } else { >>> throw new RuntimeException( >>> "FAILED. " + name + " is archived. Expect not archived."); >>> } >>> } >> Reformatted as suggested. >> >>> 5) ArchivedModuleWithCustomImageTest.java >>> >>> 178 private static void printCommand(String opts[]) { >>> 179 StringBuilder cmdLine = new StringBuilder(); >>> 180 for (String cmd : opts) >>> 181 cmdLine.append(cmd).append(' '); >>> 182 System.out.println("Command line: [" + cmdLine.toString() + >>> "]"); >>> 183 } >>> >>> Consider putting the above method in ProcessTools.java so that >>> ProcessTools.createJavaProcessBuilder() and the above test can call it and >>> avoiding duplicate code. >>> A separate follow-up bug to address this is fine. >> That sounds good to me. We might need some reformatting for consolidation. I >> will file a follow-up RFE. >> >>> 6) PrintSystemModulesApp.java >>> >>> I don't think it is being used? >> It’s used by ArchivedModuleCompareTest.java. Looks like it was missing from >> the earlier webrev. Thanks for catching that. The file is included in the >> updated webrev. >> >> Thanks! >> Jiangli >> >>> thanks, >>> Calvin >>> >>> On 6/28/18, 4:15 PM, Jiangli Zhou wrote: >>>> This is a follow-up RFE of JDK-8201650 (Move iteration order randomization >>>> of unmodifiable Set and Map to iterators), which was resolved to allow >>>> Set/Map objects being archived at CDS dump time (thanks Claes and Stuart >>>> Marks). In the current RFE, it archives the set of system ModuleReference >>>> and ModuleDescriptor objects (including their referenced objects) in >>>> 'open' archive heap region at CDS dump time. It allows reusing of the >>>> objects and bypassing the process of creating the system ModuleDescriptors >>>> and ModuleReferences at runtime for startup improvement. My preliminary >>>> measurements on linux-x64 showed ~5% startup improvement when running >>>> HelloWorld from -cp using archived module objects at runtime (without >>>> extra tuning). >>>> >>>> The library changes in the following webrev are contributed by Alan >>>> Bateman. Thanks Alan and Mandy for discussions and help. Thanks Karen, >>>> Lois and Ioi for discussion and suggestions on initialization ordering. >>>> >>>> The majority of the module object archiving code are in heapShared.hpp and >>>> heapShared.cpp. Thanks Coleen for pre-review and Eric Caspole for helping >>>> performance tests. >>>> >>>> webrev: http://cr.openjdk.java.net/~jiangli/8202035/webrev.00/ >>>> RFE: https://bugs.openjdk.java.net/browse/JDK-8202035?filter=14921 >>>> >>>> Tested using tier1 - tier6 via mach5 including all new test cases added in >>>> the webrev. >>>> >>>> Following are the details of system module archiving, which are duplicated >>>> in above bug report. >>>> --------------------------------------------------------------------------------------------------------------------------- >>>> Support archiving system module graph when the initial module is unnamed >>>> module from -cp currently. >>>> >>>> Support G1 GC, 64-bit (non-Windows). Requires UseCompressedOops and >>>> UseCompressedClassPointers. >>>> >>>> Dump time system module object archiving >>>> ================================= >>>> At dump time, the following fields in ArchivedModuleGraph are set to >>>> record the system module information created by ModuleBootstrap for >>>> archiving. >>>> >>>> private static SystemModules archivedSystemModules; >>>> private static ModuleFinder archivedSystemModuleFinder; >>>> private static String archivedMainModule; >>>> >>>> The archiving process starts from a given static field in >>>> ArchivedModuleGraph class instance (java mirror object). The process >>>> archives the complete network of java heap objects that are reachable >>>> directly or indirectly from the starting object by following references. >>>> >>>> 1. Starts from a given static field within the Class instance (java >>>> mirror). If the static field is a refererence field and points to a >>>> non-null java object, proceed to the next step. The static field and it's >>>> value is recorded and stored outside the archived mirror. >>>> 2. Archives the referenced java object. If an archived copy of the current >>>> object already exists, updates the pointer in the archived copy of the >>>> referencing object to point to the current archived object. Otherwise, >>>> proceed to the next step. >>>> 3. Follows all references within the current java object and recursively >>>> archive the sub-graph of objects starting from each reference encountered >>>> within the object. >>>> 4. Updates the pointer in the archived copy of referecing object to point >>>> to the current archived object. >>>> 5. The Klass of the current java object is added to a list of Klasses for >>>> loading and initializing before any object in the archived graph can be >>>> accessed at runtime. >>>> >>>> Runtime initialization from archived system module objects >>>> ============================================ >>>> VM.initializeFromArchive(<class>) is called from ArchivedModuleGraph's >>>> static initializer to initialize from the archived module information. >>>> Klasses in the recorded list are loaded, linked and initialized. The >>>> static fields in ArchivedModuleGraph class instance are initialized using >>>> the archived field values. After initialization, the archived system >>>> module objects can be used directly. >>>> >>>> If the archived java heap data is not successfully mapped at runtime, or >>>> there is an error during VM.initializeFromArchive(), then all static >>>> fields in ArchivedModuleGraph are not initialized. In that case, system >>>> ModuleDescriptor and ModuleReference objects are created as normal. >>>> >>>> In non-CDS mode, VM.initializeFromArchive(<class>) returns immediately >>>> with minimum added overhead for normal execution. >>>> >>>> Thanks, >>>> Jiangli >>>> >>>> >