13

我听说过

  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 9 开始需要两倍的时间

>java-版本
java版本“1.8.0_74”
Java(TM) SE 运行时环境 (build 1.8.0_74-b02)
Java HotSpot(TM) Client VM(build 25.74-b02,混合模式,共享)

>javac 采样器.java && java 采样器
n=30 单位=milisec 最小=124 最大=205 平均值=143 中值=132


>java-版本
java版本“9-ea”
Java(TM) SE 运行时环境 (build 9-ea+111)
Java HotSpot(TM) 客户端 VM(构建 9-ea+111,混合模式)

>javac 采样器.java && java 采样器
n=30 单位=milisec 最小值=279 最大值=387 平均值=301 中值=294

>javac Sampler.java && java Sampler -XX:+UseParallelGC
n=30 单位=milisec 最小=279 最大=382 平均值=297 中值=292


>java-版本
java版本“1.8.0_76-ea”
Java(TM) SE 运行时环境 (build 1.8.0_76-ea-b04)
Java HotSpot(TM) Client VM(build 25.76-b04,混合模式,共享)

>javac 采样器.java && java 采样器
n=30 单位=milisec 最小=123 最大=227 平均值=159 中值=141

>java 采样器 -XX:+UseG1GC
n=99 单位=milisec min=188 max=340 mean=213 中位数=199

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


java -Xshare:dump

>java-版本
java版本“9-ea”
Java(TM) SE 运行时环境 (build 9-ea+111)
Java HotSpot(TM) 客户端 VM(构建 9-ea+111,混合模式,共享)

>javac 采样器.java && java 采样器
n=50 单位=milisec 最小=228 最大=422 平均值=269 中值=269

>javac Sampler.java && java Sampler -Xshare:on
<错误消息>
n=44 单位=milisec 最小=227 最大=392 平均值=247 中值=238

>javac Sampler.java && java 采样器 -Xshare:off
n=50 单位=milisec min=280 max=513 mean=315 中位数=288

>javac Sampler.java && java Sampler -Xshare:auto
n=50 单位=milisec 最小=228 最大=361 平均值=283 中值=285

使用 Java 8 EA

>java -Xshare:off 采样器
n=99 单位=milisec 最小值=124 最大值=264 平均值=150 中值=136

错误信息:

处理共享存档文件时发生错误。
无法在所需地址映射只读共享空间。
初始化虚拟机时出错
无法使用共享存档。

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

4

2 回答 2

9

是的,在当前的 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 以启用共享。

于 2016-04-03T00:19:02.007 回答
3

Java-9 上默认的 G1 垃圾收集器很可能会导致显着的启动延迟。尝试-XX:+UseParallelGC在 Java-9 或-XX:+UseG1GCJava-8 上使用相同的垃圾收集器进行检查。

于 2016-03-30T11:50:17.040 回答