Java 9 ea 中是否存在启动时间倒退?

Is there startup time regression in Java 9 ea?

听说过

  1. JVM 在每个主要版本中变得更快(在某些方面)
  2. 9 的模块化将带来更快的启动时间。

为了加快 Maven 构建速度,我下载了 jdk9-ea 并发现它需要更长的时间。而且感觉Maven启动前的延迟比较长

我尝试使用以下代码粗略测量 JVM 启动时间

public class Sampler {
    public static void main(String[] args) throws IOException, InterruptedException {
        long t = System.currentTimeMillis();
        if (args.length == 0 || args[0].startsWith("-")) {
            sample(30, args);
        } else {
            long t0 = Long.parseLong(args[0]);
            System.out.println(t - t0);
        }
    }

    static void sample(int n, String[] options) throws IOException, InterruptedException {
        File samples = new File("samples.txt");
        for (int i = 0; i < n; i++) {
            String javaPath = String.join(
                    System.getProperty("file.separator"),
                    System.getProperty("java.home"),
                    "bin",
                    "java");

            List<String> command = new ArrayList<String>();
            command.add(javaPath);
            command.addAll(Arrays.asList(options));
            command.add("Sampler");
            command.add(Long.toString(System.currentTimeMillis()));

            ProcessBuilder processBuilder = new ProcessBuilder(command)
                    .inheritIO()
                    .redirectOutput(ProcessBuilder.Redirect.appendTo(samples));

            Process process = processBuilder.start();
            process.waitFor();
        }
        prettyPrint(samples);
        samples.delete();
    }
    ...
}

而且从Java开始需要两倍的时间

>java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) Client VM (build 25.74-b02, mixed mode, sharing)

>javac Sampler.java && java Sampler
n=30 units=milisec min=124 max=205 mean=143 median=132


>java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+111)
Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode)

>javac Sampler.java && java Sampler
n=30 units=milisec min=279 max=387 mean=301 median=294

>javac Sampler.java && java Sampler -XX:+UseParallelGC
n=30 units=milisec min=279 max=382 mean=297 median=292


>java -version
java version "1.8.0_76-ea"
Java(TM) SE Runtime Environment (build 1.8.0_76-ea-b04)
Java HotSpot(TM) Client VM (build 25.76-b04, mixed mode, sharing)

>javac Sampler.java && java Sampler
n=30 units=milisec min=123 max=227 mean=159 median=141

>java Sampler -XX:+UseG1GC
n=99 units=milisec min=188 max=340 mean=213 median=199

注意:最初我使用的是服务器虚拟机 (x64),相同的 2 倍差距,Java9 启动时间约为 0.6 秒。


java -Xshare:dump

之后
>java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+111)
Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode, sharing)

>javac Sampler.java && java Sampler
n=50 units=milisec min=228 max=422 mean=269 median=269

>javac Sampler.java && java Sampler -Xshare:on
<error messages>
n=44 units=milisec min=227 max=392 mean=247 median=238

>javac Sampler.java && java Sampler -Xshare:off
n=50 units=milisec min=280 max=513 mean=315 median=288

>javac Sampler.java && java Sampler -Xshare:auto
n=50 units=milisec min=228 max=361 mean=283 median=285

有Java 8个

>java -Xshare:off Sampler
n=99 units=milisec min=124 max=264 mean=150 median=136

错误信息:

An error has occurred while processing the shared archive file. 
Unable to map ReadOnly shared space at required address.
Error occurred during initialization of VM
Unable to use shared archive.

50 次中有 44 次成功开始是我能得到的最高数字。 最低的是 - 13。

Java-9 默认的 G1 垃圾收集器可能会导致严重的启动延迟。在 Java-9 上尝试 -XX:+UseParallelGC 或在 Java-8 上尝试 -XX:+UseG1GC 以检查相同的垃圾收集器。

是的,在当前的 EA 构建中肯定存在一些启动倒退 - 一些原因是已知的并且正在积极解决 - 其他更多的是 "Death by a thousand cuts" 考验:在开发过程中积累的小的、微不足道的低效率JDK 9 作为功能实现和集成,然后必须在实际发布之前进行微调和优化。

我还注意到您的 8/8-ea 运行s 运行 class 数据共享已启用,但您的 9-ea 安装没有(注意缺少"sharing" 在 -version 输出中)。如果您 运行 java -Xshare:dump 生成默认的 CDS 存档,您可能会在 9-ea 上获得更好的数字,有关详细信息,请参阅 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

编辑:我刚刚意识到在 9 版本中默认情况下共享已关闭,因此您还必须在 9-ea 中添加 -Xshare:auto 以启用共享。