2016-02-03 41 views
13

我聽說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 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. 

44成功啓動總分50是最高的NUM我可以得到。 最低的是 - 13.

+4

你真的專注於VM啓動時間,Maven編譯時間或JVM速度嗎?你似乎使用所有這些術語,就像它們是相同的,但它們不是。 – eis

+2

正如標題所暗示的,我專注於啓動時間。其他「術語」並不意味着被用作平等的,但肯定是相互關聯的。 Maven是一個衆所周知的程序的例子,其中啓動時間在整個執行時間中佔有相當大的份額。在我的理解中,啓動_is_是VM性能(速度)的一個重要特徵,而mvn build是VM性能的實際應用。不知道這是否比我最初悲傷,但在這裏更清楚。 – user2418306

+2

Maven肯定還沒有寫在Java 9中。 JVM速度通常指執行速度 - 取決於您可以選擇的服務器/客戶端模式,如果您想強調啓動時間或JVM速度以及哪種內存特性。 – eis

回答

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以啓用共享。

+0

你介意把*已知原因列表添加到你的答案中嗎? – user2418306

+0

在鏈接的指南中說*類數據共享僅支持串行垃圾收集器*。你能否對此發表評論? – user2418306

+1

拼圖本身目前在啓動過程中添加了一些設置工作,但在其他位置啓用了啓動優化,例如[JDK-8152641](https://bugs.openjdk.java.net/browse/JDK-8152641)。 9 + 108導致了與多版本JAR相關的迴歸,這應該使其成爲9 + 113,參見[JDK-8152733](https://bugs.openjdk.java.net/browse/JDK-8152733)。 –

3

很可能在Java-9上默認使用G1垃圾回收器會導致嚴重的啓動延遲。在Java-9上嘗試-XX:+UseParallelGC或在Java-8上使用-XX:+UseG1GC來檢查相同的垃圾收集器。

+0

如何解釋「ParallelGC」不能使Java 9表現更好? – user2418306

+1

在Java 9中,G1的啓動性能已經大大提高,而8(它通常可以使啓動時間加倍)。與'-XX:+ UseParallelGC'相比,它仍然具有可測量的成本,但在我們測量的大多數硬件上,它可能是噪聲或大約10ms。 –

相關問題