Последнее обновление: 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> """;
-
Запечатанные классы могут ограничивать, какие другие классы могут их расширять ( предварительная версия )
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() };
-
Записи ( Превью)
record Point(int x, int y) { }
-
Сопоставление с образцом для instanceof (Предварительный просмотр)
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
во время выполнения и создавать внутренние 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 и неблокирующим API
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());
-
Усовершенствования строк - методы:
isBlank
,lines
,repeat
иstrip
JDK 11 -
Методы фабрики удобства для коллекций, решающие проблему отсутствия литералов коллекции
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 -
Больше возможностей для преобразования (
dropWhile
,takeWhile
) и генерации (iterate
,ofNullable
) потоков; сборщики только для чтения (toUnmodifiableList
); опции могут быть преобразованы в потоки
JDK 9 -
Arrays.mismatch
: найти первый несовпадающий элемент между двумя массивами
JDK 9 -
Stack-Walking API, который позволяет использовать ленивый подход и фильтрацию кадров
JDK 9 -
API процессов предоставляет дополнительную информацию и контроль (например, идентификатор процесса, аргументы, время ЦП, родительские / дочерние процессы), а также улучшения
ProcessBuilder
помогающие создавать конвейеры процессов
JDK 9 -
VarHandle
API для замены операций, связанных с полями и массивами,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
Интернационализация
-
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
sin
,cos
и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. -
Основанный на DRBG
SecureRandom
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()
, предназначенная для фреймворков для динамического создания скрытых классов, которые не могут быть обнаружены, связаны и использованы напрямую другими классами. -
Пакет
java.lang.invoke.constant
, позволяющий легко описывать загружаемые константы (операнды дляldc
инструкции), что менее подвержено ошибкам, чем использование специального строкового представления
JDK 12 -
CONSTANT_Dynamic
запись постоянного пула, которая использует загрузку для выполнения разрешения, аналогичноINVOKEDYNAMIC
вызовам
JDK 11 -
Введение контекста управления доступом Nest, который объединяет классы в одну и ту же сущность кода - например, вложенные классы - и устраняет необходимость для компилятора вставлять методы моста в сгенерированный байт-код.
JDK 11 -
Байт-код, созданный для статической конкатенации строк, использует
invokedynamic
вместо прямого созданияStringBuilder#append
цепочек. Это позволит в будущем оптимизировать конкатенацию строк без изменения байт-кода.
JDK 9 -
INVOKEDYNAMIC
может выражать высокоуровневые операции со свойствами объекта и / или коллекциями
JDK 9
Новые поддерживаемые платформы
Схема новой версии
Устаревание и удаление
-
Удалена Nashorn Javascript Engine и
jjs
инструмент
JDK 15 (не рекомендуется в JDK 11 ) -
Устарела активация 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 -
Удален
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