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

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
05-Окт-2020 06:31

Последнее обновление: 29.09.2020, вклющее изменения до JDK 15 .С момента выпуска версии 8 до версии 15 Java формируется 163 предложениями по расширению JDK (JEP), каждое из которых вносит некоторые улучшения в платформу. Эта страница представляет собой систематизированный и тщательно подобранный список наиболее важных улучшений.
Содержание
  • Новые языковые функции
  • Новые 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, точно описывающие, какая переменная была nullJDK 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во время выполнения и создавать внутренние APIJDK 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 и неблокирующим APIJDK 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 FrameworkJDK 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=<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 все еще поддерживается, переход на последнюю версию вносит в таблицу значительное количество улучшений.
===========
Источник:
habr.com
===========

===========
Автор оригинала: Dávid Csákvári
===========
Похожие новости: Теги для поиска: #_java, #_java, #_programmirovanie (программирование), #_java
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 19:52
Часовой пояс: UTC + 5