Java 9中是否有启动时间回归?

时间:2016-02-03 14:42:53

标签: java java-9 jigsaw

我听说过

  1. JVM在每个主要版本中变得更快(在某些方面)
  2. 9的模块化将带来更快的启动时间。
  3. 为了加速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 -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。

2 个答案:

答案 0 :(得分:9)

是的,在当前的EA构建中确实存在一些启动回归 - 一些原因已知且积极地工作 - 其他原因更多的是&#34;一千次削减死亡&#34;考验:随着功能的实现和集成,JDK 9在开发过程中累积的小的,微不足道的低效率,然后必须在实际发布之前进行微调和优化。

我还注意到你的8/8-ea运行启用了类数据共享,但你的9-ea安装却没有(请注意-version输出中缺少&#34;共享&#34; )。如果您运行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以启用共享。

答案 1 :(得分:3)

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