Новые функции в Java 12

Java

Серия функций языка Java

последовательность

В этой статье в основном описываются новые функции Java 12.

номер версии

java -version
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode)

Из информации о версии видно, что это сборка 12+33.

Список функций

Shenandoah GC — сборщик мусора для low-pause-time, изначально реализован Red Hat и поддерживает архитектуру aarch64 и amd64, ZGC — тоже сборщик мусора для low-pause-time, но ZGC основан на цветных указателях. реализован на основе указателей ручьев; если вы хотите использовать Shenandoah GC, вам нужно скомпилировать с параметром --with-jvm-features с shenandoahgc, а затем использовать -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC при запуске

В исходный код jdk добавлен новый набор базовых наборов микробенчмарков.

Переключатель был улучшен. В дополнение к оператору использования можно также использовать выражение. Например, исходное написание выглядит следующим образом:

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

Теперь это можно записать следующим образом:

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

и возвращаемое значение в выражении

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

Для выражения переключения, которое должно возвращать значение, оно либо возвращает нормальное значение, либо выдает исключение, оба следующих утверждения неверны.

int i = switch (day) {
    case MONDAY -> {
        System.out.println("Monday"); 
        // ERROR! Block doesn't contain a break with value
    }
    default -> 1;
};
i = switch (day) {
    case MONDAY, TUESDAY, WEDNESDAY: 
        break 0;
    default: 
        System.out.println("Second half of the week");
        // ERROR! Group doesn't contain a break with value
};

Добавлен API констант JVM, в частности, модуль java.base добавил пакет java.lang.constant и представил интерфейс ConstantDesc (ClassDesc、MethodTypeDesc、MethodHandleDesc这几个接口直接继承了ConstantDesc接口) и интерфейс Constable; интерфейс ConstantDesc определяет метод resolveConstantDesc, а интерфейс Constable определяет методscribeConstable; String, Integer, Long, Float и Double реализуют эти два интерфейса, а EnumDesc реализует интерфейс ConstantDesc.

64-битная платформа Arm (arm64), также известная как aarch64; до того, как в JDK было две реализации aarch64, src/hotspot/cpu/arm и open/src/hotspot/cpu/aarch64, их реализации повторялись Теперь, чтобы сконцентрироваться на лучшей реализации aarch64, эта функция удаляет 64-битную реализацию в open/src/hotspot/cpu/arm из исходного кода и сохраняет 32-битную реализацию, поэтому open/src/hotspot/ Часть cpu/aarch64 становится стандартной реализацией 64-битной архитектуры ARM.

Новые возможности java10JEP 310: Application Class-Data SharingРасширяет совместное использование данных классов, введенное в JDK5, и поддерживает совместное использование данных классов приложений; совместное использование данных классов может использоваться для нескольких JVM для совместного использования классов и повышения скорости запуска. В самом начале поддерживались только системные классы и последовательный сборщик мусора , JDK9 расширил его для поддержки классов приложений и других алгоритмов GC, а также с открытым исходным кодом в JDK10 (以前是commercial feature); JDK11 изменил -Xshare:off на значение по умолчанию -Xshare:auto, чтобы упростить использование функции CDS; эта функция JDK12 по умолчанию находится в каталоге ${JAVA_HOME}/lib/server при компиляции jdk на 64-разрядном компьютере. битовая платформа Затем создается файл архива по умолчанию с именем class.jsa (大概有18M) удобен в использовании для всех

Когда G1 находится в сборке мусора, как только набор сбора определен (CSet) Процесс запуска сборки мусора не останавливается, когда набор для сбора слишком велик, время STW будет слишком большим, чтобы превысить целевое время паузы, что более очевидно в смешанных сборках. Эта функция запускает механизм, который при выборе большего набора коллекций позволяет разделить его на обязательные и необязательные части (当完成mandatory的部分,如果还有剩余时间则会去处理optional部分), чтобы изменить смешанные коллекции с без остановки на прерываемые, чтобы лучше соответствовать цели указания времени паузы

В настоящее время G1 возвращает память только во время полного GC или параллельного цикла.Поскольку G1 избегает этих двух сценариев, в большинстве сценариев память кучи Java может не быть зафиксирована в операционной системе вовремя. Эта функция JDK12 добавляет два новых параметра, G1PeriodicGCInterval и G1PeriodicGCSystemLoadThreshold.Если установлено значение 0, это означает, что отключено. Когда прошла последняя пауза сборки мусора G1PeriodicGCInterval(milliseconds) время, если getloadavg()(one-minute) ниже, чем порог, указанный G1PERIDICGCSYSTEMLOCTTHRESHOLD, триггер полного GC или одновременно GC (如果开启G1PeriodicGCInvokesConcurrent), размер кучи Java будет перезаписан и скорректирован после сборки мусора, а лишняя память будет возвращена операционной системе.

Подробная интерпретация

Выше перечислены основные функции, в дополнение к некоторым обновлениям и отказам API, в основном см.JDK 12 Release Notes, Вот несколько примеров.

Добавьте предмет

  • Поддержка юникода 11
  • Поддержка компактного форматирования чисел

Примеры использования следующие

	@Test
    public void testCompactNumberFormat(){
        var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
        System.out.println(cnf.format(1_0000));
        System.out.println(cnf.format(1_9200));
        System.out.println(cnf.format(1_000_000));
        System.out.println(cnf.format(1L << 30));
        System.out.println(cnf.format(1L << 40));
        System.out.println(cnf.format(1L << 50));
    }

вывод

1万
2万
100万
11亿
1兆
1126兆
  • Строка поддерживает операции преобразования и отступа.
    @Test
    public void testStringTransform(){
        System.out.println("hello".transform(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return s.hashCode();
            }
        }));
    }

    @Test
    public void testStringIndent(){
        System.out.println("hello".indent(3));
    }
  • Файлы добавляют метод несоответствия
    @Test
    public void testFilesMismatch() throws IOException {
        FileWriter fileWriter = new FileWriter("/tmp/a.txt");
        fileWriter.write("a");
        fileWriter.write("b");
        fileWriter.write("c");
        fileWriter.close();

        FileWriter fileWriterB = new FileWriter("/tmp/b.txt");
        fileWriterB.write("a");
        fileWriterB.write("1");
        fileWriterB.write("c");
        fileWriterB.close();

        System.out.println(Files.mismatch(Path.of("/tmp/a.txt"),Path.of("/tmp/b.txt")));
    }
  • Коллекторы добавляют метод тройника для агрегирования результатов двух нисходящих потоков.
    @Test
    public void testCollectorTeeing(){
        var result = Stream.of("Devoxx","Voxxed Days","Code One","Basel One")
                .collect(Collectors.teeing(Collectors.filtering(n -> n.contains("xx"),Collectors.toList()),
                                            Collectors.filtering(n -> n.endsWith("One"),Collectors.toList()),
                        (List<String> list1, List<String> list2) -> List.of(list1,list2)
                                            ));

        System.out.println(result.get(0));
        System.out.println(result.get(1));
    }
  • CompletionStage добавляет методы exceptionlyAsync, exceptionlyCompose, exceptionlyComposeAsync.
    @Test
    public void testExceptionallyAsync() throws ExecutionException, InterruptedException {
        LOGGER.info("begin");
        int result = CompletableFuture.supplyAsync(() -> {
            LOGGER.info("calculate");
            int i = 1/0;
            return 100;
        }).exceptionallyAsync((t) -> {
            LOGGER.info("error error:{}",t.getMessage());
            return 0;
        }).get();

        LOGGER.info("result:{}",result);
    }
  • До JDK12 у CompletionStage был только один исключительный этап, а тело метода выполнялось в основном потоке.JDK12 добавил методы исключительноAsync иэксклюзивноComposeAsync, чтобы тело метода могло выполняться в асинхронных потоках, и добавил методэксклюзивноCompose для поддержки построения новый CompletionStage в исключительных случаях.

  • Allocation of Old Generation of Java Heap on Alternate Memory Devices

G1 и Parallel GC вводят экспериментальную функцию, позволяющую распределять память старого поколения на альтернативные устройства памяти, такие как память NV-DIMM.

  • ZGC: Concurrent Class Unloading

ZGC не поддерживает выгрузку классов в JDK11.JDK12 поддерживает параллельную выгрузку классов для ZGC, которая включена по умолчанию и может быть отключена с помощью -XX:-ClassUnloading

  • Добавлен -XX:+ExtensiveErrorReports

-XX:+ExtensiveErrorReports можно использовать для сбора дополнительной информации отчета в файл hs_err.log при сбое jvm.По умолчанию он отключен в сборках продукта.Если вы хотите включить его, вам нужно добавить -XX:+ExtensiveErrorReports параметр себя

  • Добавлены улучшения, связанные с безопасностью

Поддержка системного свойства java.security.manager. Если установлено значение Disallow, SecurityManager не используется для повышения производительности. Если в это время вызывается System.setSecurityManager, будет выброшено исключение UnsupportedOperationException Новая опция -groupname для keytool позволяет указать именованную группу при создании пары ключей. Добавлено свойство конфигурации PKCS12 KeyStore для настройки генерации хранилищ ключей PKCS12. Java Flight Recorder добавляет события, связанные с безопасностью Поддержка наборов шифров TLS ChaCha20 и Poly1305

  • jdeps Reports Transitive Dependences

Параметры --print-module-deps, --list-deps и --list-reduce-deps jdeps были расширены: добавлены --no-recursive для нетранзитивного анализа зависимостей, --ignore-missing-deps для подавления ошибок отсутствия зависимости

удалить объект

  • Удалить com.sun.awt.SecurityWarnin
  • Удалите метод финализации FileInputStream, FileOutputStream, Java.util.ZipFile/Inflator/Deflator.
  • Удалить глобальный корень GTE CyberTrust
  • Удалите поддержку javac -source, -target для 6 и 1.6 и удалите параметр --release.

устаревший

  • Список устаревших API см.deprecated-list
  • Устаревший параметр -XX:+/-MonitorInUseLists
  • Устаревшее значение -keyalg для Keytool по умолчанию.

Известные проблемы

  • Swing не поддерживает GTK+ 3.20 и более поздние версии.
  • Использование компилятора JVMCI(比如Graal), возможности can_pop_frame и can_force_early_return JVMTI отключены

что-то другое

  • Если пользователь не указывает user.timezone, а тот, который получен от операционной системы, имеет значение null, начальное значение свойства user.timezone становится нулевым.
  • Поведение java.net.URLPermission немного изменилось. Раньше он игнорировал части запроса и фрагмента в URL. На этот раз были добавлены части запроса и фрагмента, а именноscheme : // authority [ / path ]изменить наscheme : // authority [ / path ] [ ignored-query-or-fragment ]
  • javax.net.ssl.SSLContext API и спецификация имен стандартных алгоритмов безопасности Java удаляют требование для реализации TLSv1 и TLSv1.1

резюме

  • java12 не LTS (Long-Term Support)Версия(oracle版本才有LTS), цикл поддержки Oracle для этой версии составляет 6 месяцев. Эта версия в основном имеет несколько точек обновления: одна — обновление уровня синтаксиса, другая — обновление уровня API, а третья — в основном обновление GC.
  • Уровень синтаксиса представляет предварительную версию Switch Expressions, уровень API представляет API констант JVM, вводит формат CompactNumberFormat, позволяет NumberFormat поддерживать COMPACTSTYLE и добавляет новые методы в String, Files, Collectors, CompletionStage и т. д. экспериментальная версия Shenandoah GC, но сборка openjdk oracle не включает поддержку Shenandoah GC, кроме того, она в основном улучшает ZGC и G1 GC
  • Среди них JDK12 поддерживает параллельную выгрузку классов для ZGC, которая включена по умолчанию и может быть отключена с помощью -XX:-ClassUnloading; для G1 GC он поддерживает функции Abortable Mixed Collections и Promptly Return Unused Committed Memory.

doc