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
>> 
>> 
> 

Reply via email to