Java 9 ea 中是否存在启动时间回归?

我听说过

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

为了加快Maven构建的速度,我下载并发现它需要更长的时间。此外,感觉在Maven开始之前有更长的延迟。jdk9-ea

我试图使用以下代码粗略地测量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 9开始需要两倍的时间

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

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


答案 1

是的,在当前的EA构建中肯定存在一些初创公司的倒退 - 一些原因已经为人所知并积极工作 - 其他原因更像是“千刀万剐”的折磨:在JDK 9的开发过程中积累的小而微不足道的低效率,因为功能被实现和集成,然后在实际发布之前必须对其进行微调和优化。

我还要注意,您的 8/8-ea 运行运行类数据共享已启用 ,但您的 9-ea 安装未启用(请注意 -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才能启用共享。


答案 2

G1 垃圾回收器(Java-9 上的默认设置)可能会导致显著的启动延迟。尝试在 Java-9 或 Java-8 上使用相同的垃圾回收器进行检查。-XX:+UseParallelGC-XX:+UseG1GC


推荐