Поиск по сайту:

Особенности Java 10


Java 10 — это самый быстрый выпуск версии Java за 23-летнюю историю. Java критиковали за медленный рост и эволюцию, но Java 10 просто разрушила эту концепцию. Java 10 — это релиз со множеством футуристических изменений, масштабы и последствия которых могут быть неочевидны, но притянуты за уши. В этой статье мы обсудим различные функции, добавленные в выпуске Java10. Перед этим давайте рассмотрим некоторые изменения, внесенные в модель выпуска Java.

Модель долгосрочной поддержки

Начиная с 2017 года, Oracle и сообщество Java объявили о переходе на новый 6-месячный график для Java. Он перешел на модель долгосрочной поддержки (LTS) для продуктов Oracle Java SE. Что это значит? LTS-версия продуктов будет предлагать первоклассную и постоянную поддержку от Oracle, и она будет обновляться каждые 3 года. Каждый выпуск Java создан по образцу одной или двух основных функций, эти функции определяют выпуск. Любое препятствие откладывает выпуск и опаздывает на рынок. Project Jigsaw был главной особенностью Java 9, он несколько раз переносил даты выпуска, а выпуск откладывался более чем на 1,5 года. 6-месячный каденционный релиз будет следовать за релизным поездом. Выпуск поезда будет иметь расписание каждые 6 месяцев. Особенности, которые заставляют резаться в поезде; иначе они ждут следующего запланированного поезда.

Oracle JDK против Open JDK

Чтобы быть более удобным для разработчиков, сообщество Oracle и Java теперь продвигает двоичные файлы OpenJDK в качестве основного JDK в будущем. Это большое облегчение по сравнению с прежними днями, когда бинарные файлы JDK были собственностью и лицензировались Oracle, у которой были различные ограничения на распространение. Однако Oracle продолжит выпуск JDK, но только для выпусков с долгосрочной поддержкой. Это шаг к тому, чтобы быть более дружественным к облаку и контейнерам, поскольку открытые двоичные файлы JDK могут распространяться как часть контейнера. Что это значит? Бинарные файлы Open JDK будут выпускаться каждые 6 месяцев, а бинарные файлы Oracle JDK будут выпускаться каждые 3 года (версия LTS). Какие двоичные файлы JDK будут приняты? Крупным организациям требуется время, чтобы перейти от одной версии к другой; они цепляются за версию, пока не могут. Принятие Java 6 в отрасли было больше, чем Java 7, а затем промышленность постепенно переходит на Java 9 и 10, которые не являются версиями LTS. Java 11, которая должна выйти в сентябре 2018 года, будет выпуском LTS.

Особенности Java 10

Давайте кратко рассмотрим функции, доступные в Java 10.

Версии выпуска на основе времени (JEP 322)

С принятием цикла выпуска, основанного на времени, Oracle изменила схему строк версий платформы Java SE и JDK, а также соответствующую информацию о версиях для настоящих и будущих моделей выпуска, основанных на времени. Новый шаблон номера версии: $FEATURE.$INTERIM.$UPDATE.$PATCH $FEATURE: счетчик будет увеличиваться каждые 6 месяцев и будет основываться на версиях выпуска функций, например: JDK 10. , JDK 11. $INTERIM: счетчик будет увеличиваться для нефункциональных выпусков, которые содержат совместимые исправления ошибок и улучшения, но не содержат несовместимых изменений. Обычно это будет ноль, так как в течение шести месяцев не будет промежуточного выпуска. Это сохранено для будущего пересмотра модели выпуска. $UPDATE: счетчик будет увеличиваться для совместимых выпусков обновлений, которые устраняют проблемы безопасности, регрессии и ошибки в новых функциях. Он обновляется через месяц после выпуска функции и затем каждые 3 месяца. Выпуск за апрель 2018 г. — JDK 10.0.1, выпуск за июль — JDK 10.0.2 и т. д. $PATCH: счетчик будет увеличен для аварийного выпуска для устранения критической проблемы. Были добавлены новые API для программного получения этих значений счетчика. Давайте взглянем;

Version version = Runtime.version();
version.feature();
version.interim();
version.update();
version.patch();

Теперь давайте взглянем на программу запуска Java, которая возвращает информацию о версии:

$ java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

Формат номера версии — «10», так как нет другого счетчика, отличного от нуля. Добавляется дата выпуска. 18.3 можно прочитать как 2018 год и 3-й месяц, сборка 10+46 — это 46-я сборка для версии 10. Для гипотетической сборки 93 JDK 10.0.1 сборка будет 10.0.1 + 939. ### Определение типа локальной переменной (JEP 286)

Вывод типа локальной переменной — самая большая новая функция в Java 10 для разработчиков. Он добавляет вывод типа к объявлениям локальных переменных с инициализаторами. Вывод локального типа можно использовать только в следующих сценариях:

  • Ограничено только локальной переменной с инициализатором
  • Индексы расширенного цикла for или индексы
  • Локальный объявлен в цикле for

Давайте посмотрим на его использование:

var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList<String>
// Index of Enhanced For Loop
for (var number : numbers) {
	System.out.println(number);
}
// Local variable declared in a loop
for (var i = 0; i < numbers.size(); i++) {
	System.out.println(numbers.get(i));
}

Вы можете узнать больше об этом в нашем эксклюзивном посте о выводе типа локальной переменной java 10.13. ### Экспериментальный JIT-компилятор на основе Java (JEP 317)

Эта функция позволяет использовать основанный на Java JIT-компилятор Graal в качестве экспериментального JIT-компилятора на платформе Linux/x64. Это, безусловно, самое футуристическое включение в список функций Java 10. Graal появился в Java 9. Это альтернатива JIT-компилятору, к которому мы привыкли. Это плагин к JVM, что означает, что JIT-компилятор не привязан к JVM, и его можно динамически подключать и заменять любым другим плагином, совместимым с JVMCI (Java-Level JVM Compiler Interface). Он также обеспечивает компиляцию Ahead of Time (AOT) в мире Java. Он также поддерживает интерпретацию языка полиглота. «Компилятор Just in Time на основе Java, написанный на Java для преобразования байт-кода Java в машинный код». Это сбивает с толку? Если JVM написана на Java, то разве вам не нужна JVM для запуска JVM? JVM можно скомпилировать AOT, а затем JIT-компилятор можно использовать внутри JVM для повышения производительности за счет оптимизации живого кода. полная переработка JIT-компилятора на Java с нуля. Предыдущий JIT-компилятор был написан на c++. Он считается последним этапом эволюции любого языка программирования. Вы можете переключиться на Graal со следующими параметрами jvm:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

Вы можете узнать больше о Graal из презентации Криса Ситона.16. ### Совместное использование данных классов приложений (JEP 310)

Эта функция помогает улучшить стартовый след, расширяет существующую функцию совместного использования данных классов (\CDS), позволяя помещать классы приложений в общий архив. JVM при запуске выполняет некоторые предварительные шаги, одним из которых является загрузка классов в памяти.Если есть несколько jar-файлов с несколькими классами, то отчетливо видна задержка в первом запросе.Это становится проблемой с бессерверной архитектурой, где время загрузки критично.Чтобы снизить время запуска приложения, Application class-data можно использовать совместное использование. Идея состоит в том, чтобы уменьшить занимаемую площадь путем совместного использования общих метаданных классов в различных процессах Java. Этого можно достичь, выполнив следующие 3 шага: Определение классов для архивирования: используйте средство запуска Java для создания списка файлов для архивирования, это может быть достигнуто следующими параметрами:

$java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld

Создание архива AppCDS: Используйте java launcher для создания архива списка файлов, которые будут использоваться для Application CDS, это может быть достигнуто следующими параметрами:

$java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar

Использование архива AppCDS: Используйте программу запуска Java со следующими параметрами для использования Application CDS.

$java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld

Параллельный полный сборщик мусора для G1 (JEP 307)

Сборщик мусора G1 был сделан по умолчанию в JDK 9. Сборщик мусора G1 избегает полной сборки мусора, но когда параллельные потоки для сбора не могут восстановить память достаточно быстро, это влияет на работу пользователей. Это изменение уменьшает задержку G1 в наихудшем случае, делая полный сборщик мусора параллельным. Алгоритм mark-sweep-compact из сборщика G1 распараллелен как часть этого изменения и будет запускаться, когда параллельные потоки для сбора не смогут восстановить память достаточно быстро.25. ### Интерфейс сборщика мусора (JEP 304)

Этот JEP — футуристическое изменение. Он улучшает изоляцию кода различных сборщиков мусора, вводя общий интерфейс сборщика мусора. Это изменение обеспечивает лучшую модульность внутреннего кода сборщика мусора. Это поможет в будущем добавить новый GC без изменения существующей кодовой базы, а также поможет в удалении или обслуживании предыдущего GC.26. ### Дополнительные расширения языковых тегов Unicode (JEP 314)

Эта функция улучшает java.util.Locale и связанные API для реализации дополнительных расширений Unicode для языковых тегов BCP 47. Начиная с Java SE 9, поддерживаемые расширения языковых тегов BCP 47 U: «ca» и «nu». Этот JEP добавит поддержку следующих дополнительных расширений:

  • у.е. (тип валюты)
  • fw (первый день недели)
  • rg (переопределение региона)
  • tz (часовой пояс)

Для поддержки этих дополнительных расширений в различные API вносятся изменения для предоставления информации на основе U или дополнительных расширений.

java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.time.format.DecimalStyle::of
java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider

Корневые сертификаты (JEP 319)

Чтобы продвигать OpenJDK и сделать его более привлекательным для пользователей сообщества, эта функция предоставляет набор сертификатов корневого центра сертификации (CA) по умолчанию в JDK. Это также будет означать, что бинарные файлы Oracle и Open JDK будут функционально одинаковыми. Критические компоненты безопасности, такие как TLS, будут работать по умолчанию в будущих сборках OpenJDK.30. ### Рукопожатия, локальные для потока (JEP 312)

Это внутренняя функция JVM для повышения производительности. Операция рукопожатия — это обратный вызов, который выполняется для каждого потока JavaThread, пока этот поток находится в состоянии точки безопасности. Обратный вызов выполняется либо самим потоком, либо потоком виртуальной машины, сохраняя поток в заблокированном состоянии. Эта функция позволяет выполнять обратный вызов для потоков без создания глобальной точки сохранения виртуальной машины. Сделать возможным и дешевым останавливать отдельные потоки, а не только все потоки или ни одного.31. ### Выделение кучи на альтернативных устройствах памяти (JEP 316)

Приложения стали требовательны к памяти, растет количество облачных приложений, баз данных в памяти, потоковых приложений. Для обслуживания этих сервисов доступны различные архитектуры памяти. Эта функция расширяет возможности HotSpot VM по размещению кучи объектов Java на альтернативном устройстве памяти, таком как NV-DIMM, указанном пользователем. Этот JEP нацелен на альтернативные устройства памяти, которые имеют ту же семантику, что и DRAM, включая семантику атомарных операций, и поэтому могут использоваться вместо DRAM для кучи объектов без каких-либо изменений в существующем коде приложения.32. ### Удалите инструмент генерации собственных заголовков — javah (JEP 313)

Это служебное изменение для удаления инструмента javah из JDK. Функциональность инструмента добавлена в javac как часть JDK 8, что дает возможность писать собственные заголовочные файлы во время компиляции, делая javah бесполезным.35. ### Объединение леса JDK в единый репозиторий (JEP 296)

На протяжении многих лет существовали различные репозитории Mercurial для кодовой базы JDK. Различные репозитории дают некоторые преимущества, но они также имеют различные операционные недостатки. В рамках этого изменения многочисленные репозитории леса JDK объединяются в один репозиторий, чтобы упростить и оптимизировать разработку.36. ### Изменения API

В Java 10 добавлены и удалены (да, это не опечатка) API. В Java 9 введено расширенное устаревание, когда определенные API были помечены для удаления в будущих выпусках. Удаленные API: вы можете найти удаленные API здесь. Пройдемся по нескольким дополнениям:

  • Интерфейсы List, Map и Set добавляются с помощью статического метода copyOf(Collection). Он возвращает неизменяемый список, карту или набор, содержащий предоставленные записи. Для списка, если данный список впоследствии будет изменен, возвращенный список не будет отражать такие изменения.
  • Необязательный и его примитивные варианты получают метод orElseThrow(). Это то же самое, что и get(), однако в документации по Java указано, что это предпочтительнее, чем get()
  • Класс Collectors получает различные методы для сбора неизменяемых коллекций (Set, List, Map)

List<String> actors = new ArrayList<>();
actors.add("Jack Nicholson");
actors.add("Marlon Brando");
System.out.println(actors); // prints [Jack Nicholson, Marlon Brando]
// New API added - Creates an UnModifiable List from a List.
List<String> copyOfActors = List.copyOf(actors);
System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
// copyOfActors.add("Robert De Niro"); Will generate an
// UnsupportedOperationException
actors.add("Robert De Niro");
System.out.println(actors);// prints [Jack Nicholson, Marlon Brando, Robert De Niro]
System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
		
String str = "";
Optional<String> name = Optional.ofNullable(str);
// New API added - is preferred option then get() method
name.orElseThrow(); // same as name.get()  

// New API added - Collectors.toUnmodifiableList
List<String> collect = actors.stream().collect(Collectors.toUnmodifiableList());
// collect.add("Tom Hanks"); // Will generate an
// UnsupportedOperationException

Заключение

В этой статье мы рассмотрели различные новые функции, добавленные в Java 10. Если вы считаете, что здесь упущено что-то важное, сообщите нам об этом в комментариях. Как обычно, вы можете проверить полный код на GitHub здесь.