Подтвердить что ты не робот

Есть ли регрессия времени запуска в Java 9 ea?

Я слышал, что

  • JVM становится быстрее (в некотором роде) с каждым основным выпуском
  • модульность 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

Примечание. Первоначально я использовал серверные VM (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 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 - это самое большое число, которое я мог получить. Самый низкий - 13.

4b9b3361

Ответ 1

Да, в текущих сборниках 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, чтобы включить общий доступ.

Ответ 2

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