See http://cr.openjdk.java.net/~mchung/jigsaw/jake-startup.20151005.pdf
Mandy p.s. In fact the attachment got trimmed. > On Oct 6, 2015, at 7:31 AM, Mandy Chung <mandy.ch...@oracle.com> wrote: > > I realize I missed the attachment after seeing Claes’ question. This > includes the heap usage after GC. > > > > > > >> On Oct 5, 2015, at 2:13 PM, Mandy Chung <mandy.ch...@oracle.com> wrote: >> >> I have been experimenting a jlink plugin to improve the module system >> startup time. On a Quad-Core Intel Xeon E5 @3.7 GHz, 16G memory (Mac Pro) >> machine, the module system startup takes 110 ms and 75% of it is to >> reconstitute 64 module descriptors with 2388 packages altogether. >> >> This high overhead includes initializing lambda forms (class loading, >> linking, initialization), parsing of module-info.class and compilation of >> many methods during startup. >> >> The attached charts shows the summary of module system startup >> 1) jake-b83 (as of Sep 29) >> module bootstrap time 110 ms >> module descriptor reconstitution 82 ms >> VM startup time is 3x of jdk9-b83 vm startup time (148ms vs 47 ms) >> >> 2) No lambda at startup >> module bootstrap time 66 ms (saved 44 ms compared to #1) >> module descriptor reconstitution 33.6 ms (saved 48.4ms) >> VM startup time is 2.2x of jdk9-b83 (105ms vs 47ms) >> >> >> 3) jlink plugin to generate a .class file to build module descriptors at >> link time >> module bootstrap time 50.7 ms (saved 15.3ms compared to #2) >> module descriptor reconstitution 16.8 ms (saved 16.8ms) >> VM startup time is 1.9x of jdk9-b83 (90ms vs 47ms) >> >> For #3, it parses module-info.class at link time and validates all names. >> It generates a .class file to call a custom Builder to create >> ModuleDescriptor for the installed modules. At runtime, the generated class >> will construct the Builder and ModuleDescriptor objects will skip name >> validation, no defensive copy of the input set/map and skip reading and >> parsing of module-info.class (this is done by a special module descriptor >> builder class that doesn’t use lambda. This special builder is only used by >> installed modules). >> >> It saves 15.3 ms (23% of the module system bootstrap time in #2). The >> downside of this optimization is a little harder to make change and diagnose >> (this plugin implementation is straight forward though). There may be >> other small optimization to explore that could be done at jlink time (e.g. >> BuiltinClassLoader maintains a package to module map that can be constructed >> with a specific size to avoid map resizing). >> >> What’s your thought/opinion to integrate this jlink plugin into jake? >> >> Mandy >> >