2016-02-03 6 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), одинаковые 2x разрыва, время запуска 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 еа

 
>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 является примером хорошо известной программы, где время запуска имеет значительную долю в общем времени выполнения. В моем понимании startup _is_ важной характеристикой производительности (скорости) VM и сборки mvn является производительность VM в действии.Не уверен, что это более ясно, чем то, что я грустно изначально, но здесь. – user2418306

+2

Maven, безусловно, еще не написана в java 9 в виду. Скорость JVM обычно относится к скорости выполнения - в зависимости от режимов сервера/клиента, которые вы можете выбрать, если хотите подчеркнуть время запуска или скорость JVM и какие характеристики памяти. – eis

ответ

9

Да, в текущих сборниках EA определенно есть некоторые регрессии запуска - некоторые из них известны и активно работают, другие - скорее «испытание смертью на тысячу разрезов»: небольшая, незначительная неэффективность, накопленная в ходе разработки JDK 9, поскольку функции реализованы и интегрированы, которые затем должны быть доработаны и оптимизированы до фактического выпуска.

Я также хотел бы отметить, что ваши 8/8-ea запускают совместное использование данных класса, но ваша установка 9-ea не делает (обратите внимание на отсутствие «совместного использования» в выводе -version). Вы можете получить более качественные цифры на 9-ea, если вы запустите java -Xshare: дамп для создания архива CDS по умолчанию, см. https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html для получения дополнительной информации.

Редактировать: Я просто понял, что общий доступ отключен по умолчанию в 9 сборках, поэтому вам также нужно добавить -Xshare: auto в 9-ea, чтобы включить общий доступ.

+0

Не могли бы вы добавить список * известных причин * к вашему ответу? – user2418306

+0

В связанном руководстве сказано, что * обмен данными между классами поддерживается только с серийным сборщиком мусора *. Не могли бы вы прокомментировать это? – user2418306

+1

Jigsaw сама по себе добавляет некоторые настройки во время запуска, но позволяет оптимизировать запуск в другом месте, например, [JDK-8152641] (https://bugs.openjdk.java.net/browse/JDK-8152641). 9 + 108 вызвал регрессию, связанную с Multi-Release JAR, которая должна сделать ее равной 9 + 113, см. [JDK-8152733] (https://bugs.openjdk.java.net/browse/JDK-8152733). –

3

Вероятно, сборщик мусора G1, который по умолчанию используется на Java-9, вызывает значительную задержку запуска. Попробуйте -XX:+UseParallelGC на Java-9 или -XX:+UseG1GC на Java-8 для проверки с тем же сборщиком мусора.

+0

Как вы можете объяснить, что 'ParallelGC' не делает Java 9 лучше? – user2418306

+1

Производительность при запуске G1 значительно улучшилась в Java 9 по сравнению с 8 (где часто можно было удвоить время запуска). Он по-прежнему имеет измеримую стоимость по сравнению с «-XX: + UseParallelGC', но это шумит или около 10 мс на большинстве аппаратных средств, на которых мы измеряем. –