Систематизированный список всех функций Java и JVM в Java 8-15

в 19:26, , рубрики: java, Программирование

Последнее обновление: 29.09.2020, вклющее изменения до JDK 15 .

С момента выпуска версии 8 до версии 15 Java формируется 163 предложениями по расширению JDK (JEP), каждое из которых вносит некоторые улучшения в платформу. Эта страница представляет собой систематизированный и тщательно подобранный список наиболее важных улучшений.

Систематизированный список всех функций Java и JVM в Java 8-15 - 1

Содержание

  • Новые языковые функции

  • Новые API

  • Улучшения производительности

  • Улучшения безопасности

  • Изменения байт-кода

  • Запуск

  • Упаковка

  • Javadoc

  • Новые платформы

  • Прекращение поддержки и удаление

  • Схема новой версии

Полный список JEP можно найти на веб-сайте OpenJDK в проектах jdk и jdk9 .

Все функции обычно доступны и включены по умолчанию, за исключением случаев, когда они помечены одним из следующих значений:

  • Предварительный просмотр  функции полностью определены и реализованы, но еще не считаются окончательными. Они считаются почти завершенными, ожидая дополнительного раунда реальных отзывов. Они должны быть явно включены .

  • Экспериментальные  функции менее стабильны и с большей вероятностью изменятся. Они также должны быть явно включены.

  • Модули инкубатора не являются финальными инструментами и API и распределены в отдельных модулях .

Новые языковые функции

Когда в Java 8 появились лямбды, это было довольно значительным изменением. Хотя последние версии не добавляли таких впечатляющих функций, в язык было внесено множество небольших улучшений.

Вот краткий обзор того, что произошло за последние годы. Более подробное руководство см. В разделе Новые возможности языка, начиная с Java 8 .

  • Текстовые блоки

    JDK 15 (предварительная версия в JDK 14 и JDK 13 )

    String html = """
                <html>
                    <body>
                        <p>Hello, world</p>
                    </body>
                </html>
                """;
  • Запечатанные классы могут ограничивать, какие другие классы могут их расширять ( предварительная версия )

    JDK 15

    public abstract sealed class Shape
        permits Circle, Rectangle {...}
    
    public class Circle extends Shape {...} // OK
    public class Rectangle extends Shape {...} // OK
    public class Triangle extends Shape {...} // Compile error
    
    // No need for default case if all permitted types are covered
    double area = switch (shape) {
        case Circle c    -> Math.pow(c.radius(), 2) * Math.PI
        case Rectangle r -> r.a() * r.b()
    };
  • Записи ( Превью)

    JDK 15 и JDK 14

    record Point(int x, int y) { }
  • Сопоставление с образцом для instanceof (Предварительный просмотр)

    JDK 15 и JDK 14

    if (obj instanceof String s) {
        System.out.println("obj is a String and it' length is " + s.length());
    }
  • Выражение переключателя

    JDK 14 (предварительная версия в JDK 12 и JDK 13)

    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        default      -> {
          String s = day.toString();
          int result = s.length();
          yield result;
        }
    };
  • Полезные исключения NullPointerExceptions, точно описывающие, какая переменная была null

    JDK 15 (Включено -XX:+ShowCodeDetailsInExceptionMessagesв JDK 14 )

    a.b.c.i = 99;
    ---
    Exception in thread "main" java.lang.NullPointerException:
          Cannot read field "c" because "a.b" is null
  • Введение varчтобы сделать объявления локальных переменных менее церемонными

    JDK 11 (без поддержки лямбда в JDK 10 )

    var greeting = "Hello World!";
  • Подключаемая и обратно совместимая модульная система, позволяющая избежать исключения ClassDefNotFoundErrorsво время выполнения и создавать внутренние API

    JDK 9 (Project Jigsaw)

    module hu.advancedweb.helloworld {
        requires hu.advancedweb.somedependency;
        exports hu.advancedweb.hello
    }
  • Частные методы в интерфейсах
    JDK 9 (Проект Milling Coin)

  • Оператор Diamond для анонимных внутренних классов
    JDK 9 (Проект Milling Coin)

  • Try-with-resources позволяющая эффективно использовать final переменные
    JDK 9 (Проект Milling Coin)

  • @SafeVargsв  методах частного экземпляра
    JDK 9 (Проект Milling Coin)

  • Нет предупреждений об устаревании для importоператоров
    JDK 9

Новые API

Давайте продолжим со Стандартной библиотекой Java, сосредоточив внимание на новых функциях, которые мы можем использовать в повседневном кодировании.

Если вам интересно узнать обо всех различиях уровней API между Java 8 и 14, посмотрите AdoptOpenJDK / jdk-api-diff на GitHub .

Общее

  • Поддержка неизменяемых сопоставленный с памятью байтовых буферов (Non-Volatile Mapped Byte Buffers) в API-интерфейсе FileChannel
    JDK 14

  • Files.mismatch: найти первый несовпадающий байт в содержимом двух файлов
    JDK 12

  • Collectors.teeingдля создания коллектора, который представляет собой смесь двух нижележащих сборщиков
    JDK 12

  • Улучшения строк: indentи transform
    JDK 12

  • Стандартный HTTP-клиент с поддержкой HTTP/2, WebSocket и неблокирующим API

    JDK 11 ( Incubator в JDK 9 )

    HttpClient httpClient = HttpClient.newBuilder().build();
    
    HttpRequest request =
      HttpRequest.newBuilder()
        .uri(URI.create("https://advancedweb.hu/"))
        .GET()
        .build();
    
    HttpResponse<String> response =
      httpClient.send(request, BodyHandlers.ofString());
  • Усовершенствования строк - методы: isBlanklinesrepeatи strip
    JDK 11

  • Методы фабрики удобства для коллекций, решающие проблему отсутствия литералов коллекции

    JDK 9

    Set<Integer> mySet = Set.of(1, 2, 3);
    List<Integer> myList = List.of(1, 2, 3);
    Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
  • Фреймвок публикации-подписки Reactive Streams для обработки асинхронных потоков с неблокирующим обратным давлением
    JDK 9

  • Связанные со временем улучшения CompletableFuture(тайм-аут, задержка)
    JDK 9

  • Больше возможностей для преобразования ( dropWhiletakeWhile) и генерации ( iterateofNullable) потоков; сборщики только для чтения ( toUnmodifiableList); опции могут быть преобразованы в потоки
    JDK 9

  • Arrays.mismatch: найти первый несовпадающий элемент между двумя массивами
    JDK 9

  • Stack-Walking API, который позволяет использовать ленивый подход и фильтрацию кадров
    JDK 9

  • API процессов предоставляет дополнительную информацию и контроль (например, идентификатор процесса, аргументы, время ЦП, родительские / дочерние процессы), а также улучшения ProcessBuilder помогающие создавать конвейеры процессов
    JDK 9

  • VarHandleAPI для замены операций, связанных с полями и массивами, java.util.concurrent.atomicи sun.misc.Unsafeдля обеспечения низкоуровневых механизмов доступа, например, атомарной записи.
    JDK 9

  • Новые комбинаторы и методы поиска для MethodHandle
    JDK 9

  • Расширенная политика устаревания. @Deprecatedможет быть отмечен значком forRemoval, который выдает новое предупреждение.
    JDK 9

  • OASIS Standard XML Catalog API для безопасного и производительного управления внешними ресурсами в XML
    JDK 9

  • Обновите анализатор XML JDK, Xerces, до версии 2.11.0
    JDK 9

  • Поддержка TIFF для Image I/O Framework

    JDK 9

Интернационализация

  • Unicode 10.0, добавление примерно 27000 символов, 10 блоков и более 30 скриптов
    JDK 11 (поддержка Unicode 8.0 в JDK 9 )

  • java.util.Localeи связанные API поддерживают тип валюты, часовой пояс и многое другое.
    JDK 10

  • ResourceBundleзагружает файлы свойств в UTF-8 вместо ISO-8859-1
    JDK 9

  • Данные локали CLDR включены по умолчанию
    JDK 9

Графика и настольные приложения

  • Функции рабочего стола для всех платформ, такие как прослушиватель событий входа / вывода / блокировки и взаимодействие с панелью задач
    JDK 9

  • MultiResolutionImageкоторый упрощает получение изображения с определенным разрешением для DPI
    JDK 9

  • Графика HiDPI в Windows и Linux
    JDK 9

  • Включение GTK 3 в Linux для JavaFX, Swing и AWT
    JDK 9

  • Замена тегов Javadoc @beaninfoи @BeanInfoаннотациями для Swing
    JDK 9

  • Обновление GStreamer, включенннное в JavaFX / Media, до версии 1.4.4
    JDK 9

  • Замена существующего механизм компоновки шрифтов ICU OpenType на HarfBuzz
    JDK 9

Улучшения производительности

Общее

  • API доступа к внешней памяти для безопасного и эффективного использования памяти вне кучи ( инкубатор )
    JDK 15 JDK 14

  • Включение динамическое архивирование классов в конце выполнения Java-приложения
    JDK 13

  • Совместное использование данных классов приложений для сокращения времени запуска и уменьшения занимаемой площади за счет обмена метаданными классов между процессами Java.
    JDK 10

  • Архив с совместным использованием данных классов для списка классов по умолчанию включен по умолчанию, чтобы сократить время запуска "из коробки"
    JDK 12

  • Компактные строки с компактным размером, более эффективно хранящие строки только для Latin-1
    JDK 9

  • Кеши кода профилированного и непрофилированного скомпилированного кода разделены, что приводит к повышению производительности и увеличению объема памяти
    JDK 9

  • Хранение интернированных строк в архивах совместного использования данных классов, чтобы уменьшить потребление памяти
    JDK 9

Библиотека

  • Улучшенные встроенные функции для java.lang.Math sincosи logфункции на процессорах AArch64
    JDK 11

  • Улучшения производительности Security Manager
    JDK 9

  • Spin-Wait Hint ( Thread#onSpinWait) для оптимизации циклов в стиле «занято-ожидание»
    JDK 9

  • Использование Marlin Renderer в Java 2D в качестве растеризатора графики по умолчанию вместо Pisces
    JDK 9

  • Повышена производительность GHASH и RSA за счет использования недавно представленных инструкций процессора SPARC и Intel x64
    JDK 9.

Параллелизм

  • Thread-Local Handshakes (Локальные рукопожатия потока) для остановки отдельных потоков
    JDK 10

  • Улучшена производительность мониторов конкурирующих объектов
    JDK 9

  • Дополнительное пространство в стеке потоков для критических секций, снижающее риск тупиковой ситуации при java.util.concurrentблокировках в случае переполнения стека
    JDK 9

Компилятор

  • Возможность предварительной компиляции для Linux ( экспериментальная )
    JDK 10 (Graal как экспериментальный JIT-компилятор) JDK 9 (интерфейс JVM-компилятора) JDK 9 (Graal как AoT-компилятор)

  • Повышение производительности в javac: новая стратегия проверки типов многоязычных выражений
    JDK 9

Сборщик мусора G1 (по умолчанию)

  • Распределение памяти с учетом NUMA
    JDK 14

  • Возможность прерывания смешанных коллекций для обеспечения поставленной пользователем паузы
    JDK 12

  • Автоматический возврат память кучи в операционную систему при простое
    JDK 12

  • Параллельный полный сборщик мусора для уменьшения задержек в худшем случае
    JDK 10

  • Сборщик мусора G1 теперь по умолчанию вместо Parallel GC
    JDK 9

Другие сборщики мусора

  • Z Garbage Collector, предлагающий очень малое время задержки для больших куч
    JDK 15 ( экспериментальный в JDK 14 (Windows) JDK 14 (OS X) JDK 11 (Linux))

  • Сборщик мусора Shenandoah, предлагающий те же преимущества, что и ZGC, но основанный на другом алгоритме
    JDK 15 ( экспериментальный в JDK 12)

  • Сборщик мусора Epsilon, который не реализует фактическое восстановление памяти, стремясь к минимально возможным накладным расходам
    JDK 11

  • XX:AllocateHeapAt=&lt;path>для поддержки альтернативных устройств памяти
    JDK 10

Диагностика и инструменты

  • Потоковая передача событий Flight Recorder: данные профилирования доступны через API , что делает его пригодным для непрерывного мониторинга
    JDK 14

  • Microbenchmark Suite на основе JMH
    JDK 12

  • Flight Recorder является частью OpenJDK
    JDK 11

  • Профилирование кучи с низкими издержками через JMTI
    JDK 11

  • Управляемый во время выполнения и специфичный для метода контроль компиляторов C1 и C2, который позволяет включать тесты
    JDK 9

  • Детализированная, простая в настройке система ведения журнала для всех компонентов JVM
    JDK 9 (унифицированное ведение журнала JVM) JDK 9 (унифицированное ведение журнала сборщика мусора)

  • Разрешить приложению предоставлять реализацию системы журналирования для использования классами платформы
    JDK 9

Улучшения безопасности

  • Набор сертификатов корневого центра сертификации (CA) по умолчанию предоставляется с JDK, поэтому соединения TLS работают из коробки
    JDK 10

  • Валидация входящих данных сериализации
    JDK 9

  • Тип хранилища ключей по умолчанию - стандартный PKCS12 вместо проприетарного JKS
    JDK 9.

  • Основанный на DRBGSecureRandom
    JDK 9 на 

  • Отключить цепочки сертификатов X.509 с подписями на основе SHA-1
    JDK 9

  • Хеш-алгоритмы SHA-3
    JDK 9

TLS

  • Поддержка TLS 1.3
    JDK 11

  • Datagram Transport Layer Security (DTLS) API
    JDK 9

  • OCSP сшивает TLS для улучшения производительности проверки статуса сертификата
    JDK 9

  • TLS Application-Layer Protocol Negotiation (ALPN) Extension, который обеспечивает согласование протокола без дополнительных циклов передачи; ALPN - требование для соединений HTTP/ 2
    JDK 9

Крипто

  • Алгоритм цифровой подписи по кривой Эдвардса (EdDSA) - RFC8032
    JDK 15

  • Ключевое соглашение с Curve25519 и Curve448
    JDK 11

  • Криптографические алгоритмы ChaCha20 и Poly1305
    JDK 11

Запуск

  • Запуск однофайловых программ с исходным кодом, включая поддержку shebang(#!) строки в Unix
    JDK 11

  • jshell: Java REPL
    JDK 9 (Project Kulla)
    → Связано: Создание прототипов с помощью JShell

  • Компиляция для Старых Версий платформы с --release, который конфигурирует --sourceи --targetи ссылок против соответствующей версии платформы
    JDK 9

  • Ранняя проверка флагов командной строки JVM во избежание сбоев
    JDK 9

Упаковка

  • Packaging Tool, поддерживающий собственные форматы пакетов: msi, exe, pkg, dmg, deb и rpm ( Incubator )
    JDK 14

  • jlinkКомпоновщик Java, который может создать оптимизированный тонкий образ времени выполнения для модульного приложения Java, который содержит только необходимые части JDK
    JDK 9 - [ 2 ], [ 3 ], [ 4 ], [ 4 ], [ 5 ]

  • Файлы JAR с несколькими релизами, позволяющие использовать несколько версий класса для конкретных релизов Java в одном архиве
    JDK 9

Javadoc

  • Инструмент Javadoc теперь генерирует разметку HTML5 вместо макета на основе фреймов, а документация содержит поле поиска для облегчения навигацииJDK 9 - [ 2 ], [ 3 ]

Байт-код

  • Замена Unsafe::defineAnonymousClass()на Lookup::defineHiddenClass(), предназначенная для фреймворков для динамического создания скрытых классов, которые не могут быть обнаружены, связаны и использованы напрямую другими классами. 

    JDK 15

  • Пакет java.lang.invoke.constant, позволяющий легко описывать загружаемые константы (операнды для ldcинструкции), что менее подвержено ошибкам, чем использование специального строкового представления
    JDK 12

  • CONSTANT_Dynamicзапись постоянного пула, которая использует загрузку для выполнения разрешения, аналогично INVOKEDYNAMICвызовам
    JDK 11

  • Введение контекста управления доступом Nest, который объединяет классы в одну и ту же сущность кода - например, вложенные классы - и устраняет необходимость для компилятора вставлять методы моста в сгенерированный байт-код.
    JDK 11

  • Байт-код, созданный для статической конкатенации строк, использует invokedynamic вместо прямого создания StringBuilder#append цепочек. Это позволит в будущем оптимизировать конкатенацию строк без изменения байт-кода.
    JDK 9

  • INVOKEDYNAMIC может выражать высокоуровневые операции со свойствами объекта и / или коллекциями
    JDK 9

Новые поддерживаемые платформы

  • Linux / AArch64
    JDK 9

  • Linux / s390x
    JDK 9

  • Унифицированная рука32 / рука64
    JDK 9

Схема новой версии

  • Более простая схема строки версии.

    JDK 9 JDK 10

Устаревание и удаление

  • Удалена Nashorn Javascript Engine и jjsинструмент
    JDK 15 (не рекомендуется в JDK 11 )

  • Удалены порты Solaris и SPARC
    JDK 15 (устарело в JDK 14 )

  • Устарела активация RMI , влияющая на java.rmi.activationпакет и rmidинструмент, не влияет на Java RMI в целом
    JDK 15

  • Отключена предвзятая блокировка по умолчанию, исключены соответствующие флаги командной строки
    JDK 15

  • Устарела Unsafe::defineAnonymousClass()
    JDK 15

  • Удален сборщик мусора Concurrent Mark Sweep (CMS)
    JDK 14

  • Устарела комбинация ParallelScavenge + SerialOld GC
    JDK 14

  • Удалены инструменты Pack200 и API
    JDK 14

  • Устарели инструменты Pack200 и API
    JDK 11

  • Удалена Java EE
    JDK 11

  • Удалена CORBA
    JDK 11

  • Удалены Thread#destroyи Thread#stop
    JDK 11

  • varбольше не является допустимым именем класса
    JDK 10

  • Удален инструмент javah
    JDK 10

  • Подчеркивание больше не является действительным идентификатором
    JDK 9

  • Внутренние API ( sun.*) удалены или устарели
    JDK 92 ]

  • Удален apple.applescriptи com.appleупакован
    JDK 9

  • Отключены цепочки сертификатов X.509 с подписями на основе SHA-1
    JDK 9

  • Удалить директивы выбора версии JRE при запуске: JRE-Versionзапись в манифесте и -version:параметр cli
    JDK 9

  • Удален инструмент jhat
    JDK 9

  • Удален JVM TI hprof Agent
    JDK 9

  • Удалены комбинации GC, устаревшие в JDK 8
    JDK 9

  • ResourceBundle загружает файлы свойств в UTF-8 вместо ISO-8859-1
    JDK 9

  • Устарело API апплета
    JDK 9

  • Устарела Concurrent Mark Sweep Garbage Collector
    JDK 9

  • Устарела Object.finalize()
    JDK 9

  • Удалены механизмы переопределения одобренных стандартов ( lib/endorsed) и расширений ( lib/ext) из JRE
    JDK 9

  • Удален rt.jarиз JRE
    JDK 9

Если вам интересно узнать обо всех различиях API между Java 8 и 14, посмотрите сайт проекта Java Almanac . Также ознакомьтесь с jdeps , анализатором зависимостей классов Java, чтобы узнать, использует ли ваш проект старый внутренний API.

Резюме

JDK 8 был выпущен в 2014 году. Нам пришлось ждать выхода JDK 9 три с половиной года . Но с тех пор дела пошли быстрее. У Java есть новая структура релизов, цель которой - выпускать новую версию каждые шесть месяцев.

Хотя Java 8 все еще поддерживается, переход на последнюю версию вносит в таблицу значительное количество улучшений.

Автор: val6852

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js