Hi Erik, Thank you for the quick review!
Jiangli > On Jun 28, 2018, at 5:44 PM, Erik Joelsson <erik.joels...@oracle.com> wrote: > > Build changes look good. > > /Erik > > > On 2018-06-28 16:15, 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 >> >> >