Автор оригинала: Pankaj Kumar.
Java 10-это самый быстрый выпуск версии Java за всю ее 23-летнюю историю. Java подвергалась критике за ее медленный рост и эволюцию, но Java 10 просто разрушила эту концепцию. Java 10-это релиз со многими футуристическими изменениями, масштабы и влияние которых могут быть неочевидными, но притягательными.
В этой статье мы обсудим различные функции, добавленные в выпуске Java 10. Перед этим давайте рассмотрим некоторые изменения, внесенные в модель выпуска java.
Модель Долгосрочной Поддержки
Начиная с 2017 года Oracle и сообщество Java объявили о переходе на новый 6-месячный курс для Java. Он перешел на модель долгосрочной поддержки (LTS) для продуктов Oracle Java SE.
Что это значит?
LTS-версия продуктов будет предлагать первоклассную и устойчивую поддержку от Oracle, и она будет нацелена каждые 3 года.
Каждый выпуск Java моделируется по одной или двум основным функциям, эти функции управляют выпуском. Любое препятствие откладывает выпуск и опаздывает на рынок. Проект Jigsaw был основной особенностью Java 9, он пару раз перенес даты выпуска, и выпуск был отложен более чем на 1,5 года. за выпуском 6-месячной каденции последует выпускной поезд. Выпуск поезда будет осуществляться по расписанию каждые 6 месяцев. Функции, которые заставляют людей садиться в поезд; в противном случае они ждут следующего поезда по расписанию.
Oracle JDK против OpenJDK
Чтобы быть более удобным для разработчиков, сообщество Oracle и Java теперь продвигает двоичные файлы OpenJDK в качестве основного JDK в будущем. Это большое облегчение по сравнению с предыдущими днями, когда двоичные файлы JDK были собственностью и лицензированы Oracle, которая имела различные ограничения в отношении распространения. Oracle, однако, продолжит выпускать свой JDK, но только для долгосрочных выпусков поддержки. Это шаг в сторону большей совместимости с облаком и контейнерами, поскольку двоичные файлы OpenJDK могут распространяться как часть контейнера.
Что это значит?
Двоичные файлы OpenJDK будут выпускаться каждые 6 месяцев, в то время как двоичные файлы Oracle JDK будут выпускаться каждые 3 года (версия LTS).
Какие двоичные файлы JDK будут приняты?
Крупным организациям требуется время для перехода между версиями; они цепляются за версию до тех пор, пока не смогут. Промышленное внедрение Java 6 было больше, чем Java 7, а затем промышленность постепенно переходит на Java 8 . На мой взгляд, версия LTS будет наиболее предпочтительной для предприятий. Однако, будет ли это LTS-версия Oracle JDK или OpenJDK, еще предстоит узнать, отчасти потому, что в облачном пространстве многое происходит.
Java 9 и 10 не являются выпусками LTS. Java 11, которая должна выйти в сентябре 2018 года, станет выпуском LTS.
Функции Java 10
Давайте украдкой взглянем на функции, доступные в Java 10.
Управление версиями выпуска на основе времени (JEP 322)
Вывод типа локальной переменной (JEP 286)
- Ограничено только локальной переменной с инициализатором
- Индексы улучшенных для цикла или индексов
- Локальный объявлен в цикле for
Экспериментальный JIT-компилятор на основе Java (JEP 317)
Класс приложений-Обмен данными (JEP 310)
Параллельный полный GC для G1 (JEP 307)
Интерфейс сборщика мусора (JEEP 304)
Дополнительные расширения языковых тегов Unicode (JEP 314)
- cu (тип валюты)
- fw (первый день недели)
- rg (переопределение региона)
- tz (часовой пояс)
Корневые сертификаты (JEP 319)
Потоковое локальное рукопожатие (JEP 312)
Распределение кучи на альтернативных устройствах памяти (JEP 316)
Удалите инструмент создания собственных заголовков – javah (JEP 313)
Консолидация леса JDK в единое хранилище (JEP 296)
Изменения API
- Интерфейсы списка, карты и набора добавляются с помощью метода статической копии(Коллекции). Он возвращает неизменяемый список, карту или Набор, содержащий предоставленные записи. Для списка, если данный список впоследствии будет изменен, возвращенный список не будет отражать такие изменения.
- Необязательно и его примитивные вариации получают метод orElseThrow(). Это точно так же, как get (), однако в javadoc указано, что это предпочтительная альтернатива, чем get()
- Класс Collectors получает различные методы для сбора неизменяемых коллекций (Набор, список, Карта).
С принятием цикла выпуска, основанного на времени, Oracle изменила схему строк версий платформы Java SE и JDK, а также соответствующую информацию об управлении версиями для нынешних и будущих моделей выпуска, основанных на времени.
Новый шаблон номера версии является:
$ФУНКЦИЯ.$ПРОМЕЖУТОЧНЫЙ.$ОБНОВЛЕНИЕ.$ИСПРАВЛЕНИЕ
$$ФУНКЦИЯ : счетчик будет увеличиваться каждые 6 месяцев и будет основываться на версиях выпуска функций, например: JDK 10, JDK11.
$ПРОМЕЖУТОЧНЫЙ : счетчик будет увеличен для выпусков без функций, которые содержат совместимые исправления ошибок и улучшения, но не содержат несовместимых изменений. Обычно это будет равно нулю, так как в течение шести месяцев промежуточного выпуска не будет. Это сохранено для дальнейшего пересмотра модели выпуска.
$UPDATE : счетчик будет увеличен для совместимых выпусков обновлений, которые устраняют проблемы безопасности, регрессии и ошибки в новых функциях. Это обновляется через месяц после выпуска функции и каждые 3 месяца после этого. Выпуск за апрель 2018 года-JDK 10.0.1, выпуск за июль-JDK 10.0.2 и так далее
$PATCH : счетчик будет увеличен для экстренного выпуска, чтобы устранить критическую проблему. Добавлены новые API для программного получения этих значений счетчиков. Давайте взглянем;
Теперь давайте взглянем на Java launcher, который возвращает информацию о версии:
Формат номера версии – “10”, так как нет другого счетчика, который отличался бы от нуля. Добавлена дата выпуска. 18.3 можно прочитать как 2018 год и 3-й месяц, сборка 10+46-это 46-я сборка для версии 10. Для гипотетической сборки 93 JDK 10.0.1 сборка будет 10.0.1+93
Вывод типа локальной переменной-самая большая новая функция в Java 10 для разработчиков. Он добавляет вывод типа к объявлениям локальных переменных с инициализаторами. Вывод локального типа может использоваться только в следующих сценариях:
Давайте взглянем на его использование:
Вы можете прочитать больше об этом в нашем эксклюзивном посте на вывод типа локальной переменной java 10 .
Эта функция позволяет использовать JIT-компилятор Graal на основе Java в качестве экспериментального JIT-компилятора на платформе Linux/x64. Это, безусловно, самое футуристическое включение в список функций Java 10.
Graal был представлен в Java 9. Это альтернатива JIT-компилятору, к которому мы привыкли. Это плагин для JVM, что означает, что JIT-компилятор не привязан к JVM, и его можно динамически подключать и заменять любым другим плагином, совместимым с JVMCI (интерфейс компилятора JVM на уровне Java). Это также обеспечивает опережающую компиляцию (AOT) в мире Java. Он также поддерживает перевод на многоязычный язык.
“Компилятор Just in Time на основе Java, написанный на Java для преобразования байт-кода java в машинный код.” Это сбивает с толку? Если JVM написана на Java, то разве вам не нужна JVM для запуска JVM? JVM можно скомпилировать AOT, а затем JIT-компилятор можно использовать в JVM it для повышения производительности за счет оптимизации живого кода.
Graal-это полная переписка JIT-компилятора на Java с нуля. Предыдущий JIT-компилятор был написан на c++. Он считается одним из завершающих этапов эволюции любого языка программирования.
Вы можете переключиться на Graal со следующими параметрами jvm:
Вы можете узнать больше о Graal из Презентации Криса Ситона .
Эта функция помогает повысить эффективность запуска, расширяет существующую функцию совместного использования данных классов (“компакт-диски”), позволяя помещать классы приложений в общий архив.
JVM при запуске выполняет некоторые предварительные шаги, одним из которых является загрузка классов в память. Если есть несколько банок с несколькими классами, то задержка в первом запросе хорошо видна. Это становится проблемой в бессерверной архитектуре, где время загрузки имеет решающее значение. Чтобы сократить время запуска приложения, можно использовать совместное использование данных классов приложений. Идея состоит в том, чтобы уменьшить занимаемую площадь за счет обмена общими метаданными классов между различными процессами Java. Этого можно достичь с помощью следующих 3 шагов:
Определение классов для архивирования : Используйте программу запуска java для создания списка файлов для архивирования, это может быть достигнуто с помощью следующих параметров:
Создание архива компакт-дисков приложений : Используйте java launcher для создания архива списка файлов, которые будут использоваться для компакт-дисков приложений, это может быть достигнуто с помощью следующих параметров:
Использование архива компакт-дисков приложений : Используйте программу запуска Java со следующими параметрами для использования компакт-дисков приложений.
G1 сборщик мусора был установлен по умолчанию в JDK 9. Сборщик мусора G1 позволяет избежать любой полной сборки мусора, но когда параллельные потоки для сбора не могут достаточно быстро восстановить память, это влияет на работу пользователей.
Это изменение улучшает задержку G1 в наихудшем случае, делая полный GC параллельным. Алгоритм mark-sweep-compact от G1 collector распараллеливается как часть этого изменения и запускается, когда параллельные потоки для сбора не могут достаточно быстро восстановить память.
Этот джип-футуристическая перемена. Это улучшает изоляцию кода различных сборщиков мусора за счет введения общего интерфейса сборщика мусора.
Это изменение обеспечивает лучшую модульность внутреннего кода GC. Это поможет в будущем добавить новый GC без изменения существующей кодовой базы, а также поможет удалить или сохранить предыдущий GC.
Эта функция расширяет возможности java.util.Языковой стандарт и связанные с ним API для реализации дополнительных расширений Unicode языковых тегов BCP 47. Начиная с Java SE 9, поддерживаемые расширения языковых тегов BCP 47 U являются “ca” и “nu”. Этот JEP добавит поддержку следующих дополнительных расширений:
Для поддержки этих дополнительных расширений в различные API вносятся изменения для предоставления информации на основе U или дополнительных расширений.
Чтобы продвигать OpenJDK и сделать его более привлекательным для пользователей сообщества, эта функция предоставляет набор сертификатов корневого центра сертификации (CA) по умолчанию в JDK. Это также будет означать, что двоичные файлы Oracle и Open JDK будут функционально одинаковыми.
Критические компоненты безопасности, такие как TLS, будут работать по умолчанию в будущих сборках OpenJDK.
Это внутренняя функция JVM для повышения производительности.
Операция рукопожатия-это обратный вызов, который выполняется для каждого потока JavaThread, пока этот поток находится в состоянии безопасной точки. Обратный вызов выполняется либо самим потоком, либо потоком виртуальной машины, сохраняя поток в заблокированном состоянии.
Эта функция позволяет выполнять обратный вызов в потоках без выполнения глобальной точки безопасности виртуальной машины. Сделайте возможным и дешевым остановку отдельных потоков, а не только всех потоков или ни одного.
Приложения стали испытывать нехватку памяти, растет число облачных приложений, баз данных в памяти, потоковых приложений. Для обслуживания этих служб доступны различные архитектуры памяти. Эта функция расширяет возможности виртуальной машины HotSpot для выделения кучи объектов Java на альтернативном устройстве памяти, таком как NV-DIMM, указанном пользователем.
Этот JEP предназначен для альтернативных устройств памяти, которые имеют ту же семантику, что и DRAM, включая семантику атомарных операций, и поэтому могут использоваться вместо DRAM для кучи объектов без каких-либо изменений в существующем коде приложения.
Это изменение в домашнем хозяйстве для удаления инструмента java из JDK. Функциональность инструмента добавлена в java как часть JDK 8, которая обеспечивает возможность записи собственных заголовочных файлов во время компиляции, делая javah бесполезным.
На протяжении многих лет в кодовой базе JDK существовали различные репозитории Mercurial. Различные репозитории действительно дают некоторые преимущества, но у них также были различные операционные недостатки. В рамках этого изменения многочисленные репозитории леса JDK объединены в единый репозиторий для упрощения и оптимизации разработки.
Java 10 добавлена и удалена (Да, это не опечатка) API.
Java 9 представила расширенную устаревшую версию, в которой некоторые API были помечены как подлежащие удалению в будущих выпусках.
API удален : Вы можете найти удаленный API здесь .
Добавлен API : в Java 10 добавлено 73 новых API. Вы можете найти добавленный API вместе со сравнением здесь .
Давайте рассмотрим несколько дополнений:
Вывод
В этой статье мы рассмотрели различные новые функции, добавленные в Java 10. Если вы считаете, что здесь упущено что-то важное, пожалуйста, сообщите нам об этом в комментариях.
Как обычно, вы можете проверить полный код на GitHub здесь .