On 8/4/17 8:48 AM, Alan Bateman wrote:
This is a patch for jdk10/jdk10 to claw back some of the regression to
startup performance in JDK 9 for very short lived applications.
The bulk of the changes are to the "system modules" jlink plugin and
the related code in the module system initialization. Specifically,
the plugin now generates code to create the readability graph for
initial modules known at link time This allows resolution to be
skipped at startup for common cases, it also avoids needing to
reconstitute the module descriptors for modules that will not be
resolved (the EE modules when the initial module is the class path for
example). The system module finder has been significantly changed as
part of this but all the execution scenarios (images, exploded builds,
images patched with exploded build, etc.) that are needed in
differetnt JDK development scenarios work as before.
The patch also includes a few misc. changes to reduce the number of
class loaded during startup and also some local tuning. There is also
a change to the class path initialization to re-fix JDK-6760902 so
that lookup of resources on the boot loader append path
(-Xbootclasspath/a) is aligned with class loading in the VM in the way
that it skips empty path elements. This follows the restoration of
tests that Mandy pushed a few days ago with JDK-8185541.
The webrev with the changes is here:
http://cr.openjdk.java.net/~alanb/8185853/webrev/index.html
It is good to see more optimization be done at link time that improves
the startup.
jdk/internal/loader/ClassLoaders.java
79 if (cp.length() == 0) cp = null;
Our launcher and hotspot VM always set "java.class.path" system property
and so it'll be non-null. It might help the readers to check if (cp !=
null && cp.length() == 0).
jdk/internal/module/SystemModulesMap.java
128 Constructor<?> ctor = Class.forName(cn).getConstructor();
Class.forName(Module, String) will only search the specified module. No
performance difference since the class exists in java.base but it may
make it clear to the readers.
jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
This generates one SystemModules for each module that has a main
class. A user may create a launcher at link time but specifies a main
class which may be different to the one in the module descriptor. A
possible future enhancement is to generate a SystemModules for the main
class if the launcher is created by jlink.
Otherwise, this patch looks good.
Mandy