2016-02-03 20 views
13

Ho sentito dire cheEsiste la regressione del tempo di avvio in Java 9 bis?

  1. JVM diventa più veloce (in qualche modo) ad ogni major release
  2. modularità del 9 porterà il tempo di avvio più veloce.

Nel tentativo di velocizzare una build Maven, ho scaricato jdk9-ea e ho scoperto che ci vuole ancora più tempo. Inoltre, sembra che ci sia un ritardo maggiore prima dell'avvio di Maven.

Ho cercato di circa misurare il tempo di avvio di JVM utilizzando seguente codice

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(); 
    } 
    ... 
} 

e ci vuole il doppio del tempo per iniziare con 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 

Nota: In origine ho usato Server VM (x64), stesso divario 2x, il tempo di avvio di Java9 era di circa 0,6 secondi.


Dopo 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 

Con Java 8 bis

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

Messaggio di errore:

 
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 avviamenti corretti su 50 è il più alto num posso averlo. Il valore più basso era - 13.

+4

sei veramente concentrato sul tempo di avvio della VM, sul tempo di costruzione del tuo sistema di ricerca o sulla velocità della JVM? Sembri usare tutti questi termini come se fossero uguali, ma non lo sono. – eis

+2

Sono concentrato sul tempo di avvio come implica il titolo. Altri "termini" non sono pensati per essere uguali, ma sicuramente correlati tra loro. Maven è un esempio di un programma ben noto in cui il tempo di avvio ha una quota significativa nel tempo di esecuzione complessivo. Nel mio avvio comprensione _is_ una caratteristica importante delle prestazioni VM (velocità) e mvn accumulo è la prestazione VM in azione.Non sono sicuro se questo è più chiaro di quello che inizialmente mi dispiace ma qui. – user2418306

+2

Maven non è certamente ancora scritto in java 9 in mente. La velocità JVM di solito si riferisce alla velocità di esecuzione, a seconda delle modalità server/client che è possibile scegliere se si desidera enfatizzare i tempi di avvio o la velocità JVM e il tipo di caratteristiche della memoria. – eis

risposta

9

Sì, ci sono sicuramente alcune regressioni di avvio nelle attuali build di EA: alcune cause sono note e attivamente lavorate - altre sono più di una "Morte di mille tagli": piccole, insignificanti inefficienze accumulate nel corso dello sviluppo di JDK 9 in quanto le funzionalità sono implementate e integrate, che devono quindi essere messe a punto e ottimizzate prima del rilascio effettivo.

Vorrei anche notare che le tue 8/8-eaes run eseguono la condivisione dei dati di classe abilitata, ma l'installazione a 9-ea non lo fa (notare la mancanza di "condivisione" nell'output -version). È possibile ottenere numeri migliori su 9-EA se si esegue java -Xshare: dump per generare l'archivio CDS predefinito, vedere https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html per ulteriori dettagli.

Edit: Ho appena realizzato la condivisione è stata disattivata per default nel 9 costruisce in modo da avere anche aggiungere -Xshare: auto in 9-bis per attivare la condivisione.

+0

Ti dispiacerebbe aggiungere l'elenco di * cause note * alla tua risposta? – user2418306

+0

Nella guida collegata ha affermato che * la condivisione dei dati di classe è supportata solo con il raccoglitore di dati numerici *. Potresti commentare anche questo? – user2418306

+1

Attualmente Jigsaw aggiunge alcuni lavori di installazione durante l'avvio, ma abilita le ottimizzazioni all'avvio altrove, ad es. [JDK-8152641] (https://bugs.openjdk.java.net/browse/JDK-8152641). 9 + 108 ha causato una regressione relativa ai JAR multi-release che dovrebbero essere convertiti in 9 + 113, si veda [JDK-8152733] (https://bugs.openjdk.java.net/browse/JDK-8152733). –

3

È probabile che il garbage collector G1, che è predefinito su Java-9, causi un ritardo di avvio significativo. Prova a -XX:+UseParallelGC su Java-9 o -XX:+UseG1GC su Java-8 per verificare con lo stesso garbage collector.

+0

Come si può spiegare che 'ParallelGC' non rende Java 9 migliore? – user2418306

+1

Le prestazioni di avvio di G1 sono state notevolmente migliorate in Java 9 rispetto a 8 (dove poteva spesso raddoppiare i tempi di avvio). Ha ancora un costo misurabile rispetto a '-XX: + UseParallelGC', ma è un rumore o circa 10ms sulla maggior parte dell'hardware su cui misuriamo. –