18 февраля 2021 г. финальный кандидат на выпуск JDK 16 был завершен, а официальный выпуск состоится 16 марта 2021 г. Как и JDK 15, JDK 16 будет краткосрочным выпуском, поддерживаемым только в течение шести месяцев. JDK 17, выпуск которого запланирован на сентябрь 2021 года, будет выпуском с долгосрочной поддержкой (LTS) с поддержкой в течение нескольких лет. Хотя JDK 16 является краткосрочной версией, и большинство предприятий или проектов все еще застряли на JDK 11, выпущенном в сентябре 2018 года (или даже раньше, JDK 8, выпущенном в марте 2014 года), это не мешает Javaer использовать новую версию JDK. , Ожидание и энтузиазм для непрерывного обучения. Эта статья поиграет с вами в JDK 16.
Краткий обзор новых функций
Прежде чем мы начнем, давайте взглянем на 17 новых функций, представленных в выпуске JDK 16.
Новые функции, описанные в этой статье
357: репозиторий исходного кода OpenJDK переносится с Mercurial на Git. Усилия по внедрению этого изменения дадут преимущества с точки зрения размера метаданных системы контроля версий, доступных инструментов и хостинга.
369: Миграция на GitHub. Это изменение основано на переносе репозитория исходного кода OpenJDK на Git. Репозиторий исходного кода JDK 16 появится на сайте самой популярной социальной сети программистов.
386: На архитектурах x64 и AArch64 портируйте JDK на Alpine Linux и другие дистрибутивы Linux, использующие musl в качестве основной библиотеки C. Musl — это реализация Linux функций стандартной библиотеки, описанных в стандартах ISO C и Posix. Alpine Linux широко используется в облачных средах, микросервисах и контейнерных средах из-за небольшого размера образа. Версия образа контейнера Docker для Linux меньше 6 МБ. Позвольте Java работать из коробки в таких настройках и позвольте Tomcat, Jetty, Spring и другим популярным платформам работать в этих средах. Используя jlink для уменьшения размера среды выполнения Java, пользователи могут создавать образ меньшего размера для запуска определенного приложения.
394: Сопоставление с образцом для оператора instanceof, предварительно представленное как в JDK 14, так и в JDK 15, будет завершено в JDK 16. Сопоставление с образцом позволяет выражать общую логику в программах (то есть условное извлечение компонентов из объектов) более кратко и безопасно.
395: Предоставляет класс записи Record в качестве прозрачного носителя неизменяемых данных.
Другие новые функции
347: Включает функции языка C++14, позволяет использовать функции C++14 в исходном коде JDK C++ и предоставляет конкретные рекомендации о том, какие функции можно использовать в коде HotSpot.
376: переместить обработку стека потока ZGC (масштабируемый сборщик мусора с малой задержкой) из безопасной точки в параллельную фазу. Сборщик мусора ZGC предназначен для того, чтобы сделать паузы сборки мусора и проблемы с масштабируемостью в HotSpot делом прошлого.
380: добавлены каналы сокетов Unix-Domain, где поддержка сокетов Unix-Domain (AF_UNIX) была добавлена в API-интерфейсы Socket Channel и Server Socket Channel в пакете nio.channels.
387: функция эластичного метапространства может быстрее возвращать память, занимаемую неиспользуемыми метаданными класса (метапространством) виртуальной машины HotSpot, в операционную систему, тем самым уменьшая занятость метапространства и упрощая код метапространства для снижения затрат на обслуживание.
388: перенос JDK на платформу Windows/AArch64.
389: API внешнего компоновщика на стадии инкубации, который поддерживает статически типизированный чистый доступ Java к собственному коду. Цель этого проекта — обеспечить взаимодействие с языком C, заменив JNI (собственный интерфейс Java) более продвинутой моделью разработки на чистом языке Java. Его производительность будет выше, чем у JNI.
390: Предупреждающий совет для классов, основанных на значениях: назначьте исходный класс-оболочку классом, основанным на значениях, объявите его конструктор устаревшим для удаления и запросите новое предупреждение об устаревании. В платформе Java предупреждается любая неправильная попытка синхронизации экземпляра класса, основанного на значениях.
392: Предоставляет инструмент jpackage для упаковки автономных приложений Java.
396: По умолчанию внутренние компоненты JDK строго инкапсулированы, за исключением критически важных внутренних API, таких как misc.Unsafe. Цели этой инициативы включают повышение безопасности и удобства сопровождения JDK, а также поощрение разработчиков к постепенному переходу от использования внутренних элементов непосредственно к использованию стандартных API, чтобы как разработчики, так и конечные пользователи могли легко перейти на будущие версии Java.
397: вторичный предварительный просмотр запечатанных классов и интерфейсов в JDK 16, ранее представленный в JDK 15, ограничивает классы и интерфейсы, которые могут расширять или реализовывать их. Цели этой инициативы включают предоставление создателю класса или интерфейса возможности управлять кодом, ответственным за его реализацию, предоставление более декларативного способа, чем модификаторы доступа, для ограничения использования суперклассов, а также поддержку будущих разработок в области сопоставления с образцом путем предоставления основы для анализ шаблона.
338: Vector API для фазы инкубации (JDK будет поставляться с модулем инкубации), jdk.incubator.vector, для выражения векторных вычислений, скомпилированных в оптимальные аппаратные инструкции на поддерживаемых архитектурах ЦП для достижения превосходной производительности по сравнению с эквивалентной производительностью скалярных вычислений.
393: API доступа к внешней памяти на этапе инкубации, позволяющий программам Java безопасно получать доступ к внешней памяти за пределами кучи Java (включая локальный, постоянный носитель и управляемую память кучи).
Как и выше, новые функции пронумерованы как идентификаторы процесса усовершенствования JDK.Подробности см. в ссылках в конце статьи.
Попробуй это сейчас
После просмотра 17 новых функций мне не терпится попробовать JDK 16 и некоторые функции, которые помогут в разработке. Затем сначала загрузите версию-кандидат JDK 16 через официальный сайт JDK (JDK.java.net/16/).
Так как в системе удобно переключаться между несколькими версиями JDK, можно использовать jenv(GitHub.com/HungryGirls/HungryGirls).
Мы добавляем загруженный путь JDK16 в jenv, и его можно использовать после выполнения следующих настроек.
jenv add ${JDK16_Path}
jenv global openjdk64-16
Если все пойдет хорошо, при проверке версии JDK будет возвращена информация, аналогичная следующей.
java -version
openjdk version "16" 2021-03-16
OpenJDK Runtime Environment (build 16+36-2231)
OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing)
Если вы используете более раннюю версию IDEA в качестве средства разработки, вы можете получить следующую ошибку при запуске программы с JDK 16:
Cannot determine path to 'tools.jar' library for 16 (path/to/jdk-16) when running from IDEA, you should update to the latest version.
Это связано с рефакторингом JDK9 среды выполнения Java, в результате которого были удалены rt.jar, tools.jar, dt.jar и различные другие внутренние пакеты JAR. Однако более ранние инструменты разработки обычно имеют зависимости от таких пакетов JAR, которые можно решить путем обновления IDEA. Перейдите на официальный сайт, чтобы получить предварительную версию IDEA 2021.1 EAP. (woohoo.jet brains.com/this-talent/idea/…
Интерпретация новых функций
Перенести на GitHub
Еще в сентябре 2020 года OpenJDK сделал репозиторий jdk на Github основным репозиторием для чтения/записи исходного кода JDK 16. С официальным выпуском JDK 16 это будет версия JDK первого поколения, разработанная OpenJDK на Github.
Есть три основные причины для переноса репозиториев исходного кода OpenJDK с Mercurial на Git: метаданные системы контроля версий, доступные инструменты и размер доступного хостинга.
Что касается размера метаданных управления версиями, первоначальный прототип преобразованного репозитория показал значительное уменьшение размера метаданных управления версиями. Например, каталог .git репозитория jdk с использованием Git составляет около 300 МБ, а каталог .hg с использованием Mercurial — около 1,2 ГБ. Сокращение метаданных экономит место на локальном диске и сокращает время клонирования, а также уменьшает объем передаваемых данных.
Что касается доступных инструментов, у Git их больше, чем у Mercurial. Все текстовые редакторы имеют встроенную интеграцию с Git или через плагины. Кроме того, почти все IDE поставляются с интеграцией с Git, включая Eclipse, Visual Studio, IDEA.
Доступный хостинг, существует множество вариантов размещения репозиториев Git, будь то собственный хостинг или хостинг как услуга. Причины использования внешнего хостинг-провайдера включают производительность, контроль доступа к веб-API, с которыми взаимодействуют разработчики, и процветающее сообщество.
После того, как OpenJDK перешел на Github, для Java-разработчиков по-прежнему есть много удобств: Разветвив репозиторий исходного кода JDK 16 (GitHub.com/openJDK/JDK…
Если скорость интернета достаточно высока, Github1s, инструмент для чтения кода онлайн через Github (GitHub.com/con — это net/git…16 исходный код (GitHub1 is.com/openJDK/JDK…
Если вы работаете и учитесь в IDEA, клонируйте исходный код JDK 16,
Откройте структуру проекта (command+;), установите Project SDK на JDK 16 и установите уровень языка проекта на 16.
После этого вы можете с удовольствием посмотреть на исходный код JDK 16.
Портирование JDK на Alpine Linux
В облачную эпоху личное понимание повышения эффективности является первым принципом: Меньшие размеры изображений распространяются быстрее
Приложения/контейнеры запускаются быстро
Это обеспечивает достаточно быстрое горизонтальное масштабирование системы и достаточно быструю обработку отката при возникновении проблем.
Кроме того, в целях снижения затрат образ меньшего размера будет занимать меньше памяти и потреблять меньше ресурсов при распространении.
Alpine Linux — это независимый некоммерческий дистрибутив Linux общего назначения, который соответствует облачному принципу повышения эффективности.
Он ориентирован на безопасность, простоту и эффективность использования ресурсов и построен на основе musl libc и busybox. Это делает его меньше, чем традиционные дистрибутивы GNU/Linux.
Портирование JDK на Alpine Linux позволит Tomcat, Jetty, Spring и другим популярным платформам работать в нем. Пользователи могут создать образ меньшего размера для запуска определенных приложений.
Подготовьте Docker заранее, давайте создадим образ Alpine Linux, затем добавим JDK 16 и, наконец, запустим простую программу Spring Boot для демонстрации.
Создание образа Alpine Linux
# 获取Alpine Linux镜像
docker pull alpine
# 运行镜像
docker run alpine echo 'Hello Alpine!'
Глядя на размер образа с помощью команды docker images, вы обнаружите, что на момент завершения этой статьи размер образа alpine составляет всего 5,6 МБ. По сравнению с debian, ubuntu, centos и другими системами с десятками, а то и сотнями мегабайт образов, alpine действительно мал!
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 7731472c3f2a 7 weeks ago 5.61MB
Добавьте JDK 16
OpenJDK работает с использованием jlink (JEP 282), чтобы уменьшить размер среды выполнения Java, мы можем взять образ из DockerHub:16-jdk-alpine. Или следующую команду Docker:
docker pull openjdk:16-jdk-alpine
Весенняя загрузка
Сначала подготовьте программу Spring Boot FatJar, которую можно получить на официальном сайте Spring Boot.Привет мир! пример программы(spring.IO/guides/company/day…Создайте Dockerfile, используйте openjdk:16-jdk-alpine и добавьте программу Spring Boot.
FROM openjdk:16-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
построить и запустить
# 构建镜像,设置JAR_FILE参数指向Spring Boot程序Jar包路径
docker build --build-arg JAR_FILE=target/rest-service-0.0.1-SNAPSHOT.jar -t alpine-jdk16-app:latest .
# 查看镜像
docker images
# 根据镜像,启动容器运行
# -d参数 后台运行
# -p参数 Spring Boot默认端口8080,映射到容器端口8080
docker run -d -p 8080:8080 alpine-jdk16-app:latest
# 查看容器运行
docker ps
# 验证成功之后可以停止容器
docker stop ${CONTAINER_ID}
# 访问应用
curl -w '\n' http://127.0.0.1:8080/greeting?name=jdk16
На данный момент Spring Boot со средой выполнения JDK 16 через систему Alpine Linux запущен и доступен в обычном режиме.
Размер образа системы Alpine JDK 16 составляет около 321 МБ. По сравнению с 467 МБ официального образа версии Linux от Oracle, он меньше на 30%+.
рекордный класс
Функция предварительного просмотра класса Record предоставляется начиная с JDK 14, и эта функция станет постоянной функцией JDK 16. Класс Record действует как прозрачный носитель неизменяемых данных в ответ на жалобы на то, что Java слишком многословен. Цели этой инициативы включают разработку объектно-ориентированного конструктора, представляющего простой набор значений, помогая разработчикам сосредоточиться на моделировании неизменяемых данных, а не на расширении поведения, а также на автоматизации методов, управляемых данными, таких как equals() и устройство доступа к свойствам).
Этот тип можно создать в более новых версиях IDEA:
После объявления класса записи Record почти не нужно добавлять дополнительный код, а набор неявных объявлений делает написание его кода очень лаконичным:
Неявно объявленные свойства
Конструктор объявлен неявно
Неявно объявленные equals(), hashCode(), toString()
Неявно объявляет метод доступа для свойства с тем же именем, что и у свойства.
public record Point(int x, int y) {}
Класс записи Record поддерживает функцию локальных классов, поэтому, когда вам нужно временно использовать запись, вы можете легко определить и использовать:
List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {
// Local record
record MerchantSales(Merchant merchant, double sales) {}
// 使用MerchantSales Record类临时包装merchant和sales,方便做处理。
return merchants.stream()
.map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
.sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
.map(MerchantSales::merchant)
.collect(toList());
}
Класс Record сможет заменить функции кортежа, предоставляемые библиотеками инструментов вне JDK, такими как Tuple и Pair.В сочетании с функцией сопоставления с образцом, описанной ниже, код станет очень кратким.
сопоставление с образцом
Функция предварительного просмотра сопоставления шаблонов была введена, начиная с JDK 14, и также станет постоянной функцией в JDK 16. Таким образом, хотя JDK 16 является краткосрочным выпуском, это не мешает нам продолжать использовать функции сопоставления с образцом в будущих версиях JDK.
Текущий этап сопоставления с шаблоном ограничен одним шаблоном (шаблон типа) и одной языковой конструкцией (instanceof), но это только часть полного набора функций. Тем не менее, мы добились значительного преимущества: исчезли избыточные приведения, избыточный код устранен, а более важный код стал более четким, а места, где можно было бы скрыть ошибки, были устранены.
Например: Когда нам нужно разобрать объекты в разработке, мы будем использовать методы, подобные следующим
if (obj instanceof String) {
String s = (String) obj;
...
}
Использование эквивалентного кода после сопоставления с образцом:
if (obj instanceof String s) {
// 通过使用模式匹配可以直接使用s局部变量
...
}
Код выглядит намного чище.
Получение типа объекта с помощью instanceof является формой условного извлечения, и после получения типа объекта объект всегда приводится к этому типу.
Преимущество объединения этих операций, которые раньше приходилось выполнять явно после instanceof, было утомительной операцией не только для краткости, но и для устранения общего источника ошибок: вырезание и вставка instanceof и приведение кода, легко забыть изменить cast type после изменения типа instanceof, что дает укрытие для уязвимости. Сопоставление с образцом с помощью instanceof устраняет эту проблему, и мы также устраняем все ошибки этого типа.
Еще одно место, где можно выполнить такую «проверку перед приведением», — это метод equals. Давайте посмотрим на другой пример:
if (!(o instanceof Point))
return false;
Point other = (Point) o;
return x == other.x && y == other.y;
}
Использование эквивалентного кода после сопоставления с образцом:
public boolean equals(Object o) {
return (o instanceof Point other)
&& x == other.x && y == other.y;
}
Этот код делает то же самое, но проще и понятнее, потому что вместо использования оператора управления потоком мы можем выразить эквивалентное условие, используя просто составное логическое выражение.
Переменная связывания с сопоставлением с шаблоном (как в приведенном выше примере кода, s of obj instanceof String s является переменной связывания) имеет область действия, отличную от «обычных» локальных переменных, за исключением специального местоположения объявления.
Например, мы можем написать:
if (a instanceof Point p) {
// p is in scope
...
} else {
// p not in scope here
}
// p not in scope here
if (b instanceof Point p) { // Sure!
...
}
Такая специальная область видимости позволяет нам свободно переобъявлять связанные переменные в случае множественных ветвей if-else, а также удобно рассматривать будущие случаи в switch. Такие как:
if (x instanceof Integer num) { ... }
else if (x instanceof Long num) { ... }
else if (x instanceof Double num) { ... }
Если бы сопоставление с образцом могло устранить 99% операций приведения типов в коде Java, оно, несомненно, было бы популярным. Но это не останавливается на достигнутом, со временем будут появляться другие типы шаблонов, которые могут выполнять более сложное условное извлечение, использовать более сложные способы объединения шаблонов и предоставлять другие конструкции, которые могут использовать шаблоны: такие как switch, Even catch , в сочетании с такими функциями, как класс Record, который теперь поддерживается на постоянной основе, и запечатанный класс в предварительной версии, сопоставление шаблонов определенно упростит код, который мы напишем в будущем.
конец
В этой статье извлекаются несколько функций, которые полезны для инженерной работы и изучения 17 новых функций, представленных в версии JDK 16, и быстро понимается эти функции.
Большинство предприятий или проектов по-прежнему используют JDK 8 (который по-прежнему занимает 80% рынка JDK, что является абсолютным мейнстримом), основанный на супер-роскошных новых функциях JDK 8, таких как функциональные интерфейсы, лямбда-выражения, ссылки на методы/конструкторы. более сильный API Steam, улучшения интерфейса, необязательно, метапространство в JVM вместо пространства PermGen и т. д.
Мы также видим, что Java постоянно внедряет инновации, чтобы идти в ногу с быстрым темпом текущих технологических изменений.
Начиная с JDK 9, выпуск версий Java изменился на каждые 6 месяцев, JDK 11 — это выпуск с долгосрочной поддержкой, а JDK 17 будет выпущен во второй половине года.
JDK 9~JDK15 также имеет некоторые важные новые функции, такие как
- Модульная система JDK 9, интерактивная командная строка JShell
- Вывод типа локальной переменной JDK 10
- Пробная версия JDK 11 ZGC, HTTP Client API, Steam и другие улучшения
- Расширение выражения переключения JDK 12, добавляющее набор микротестов на основе JMH.
- Рефакторинг JDK 13 Socket API, текстовые блоки (многострочный текст)
- Более ценные сообщения об ошибках NPE в JDK 14, частичный предварительный просмотр функций JDK 16
- Предварительный просмотр функций JDK 16, таких как запечатанные классы JDK 15, классы записи и т. д.
Я надеюсь, что эта стратегия быстрой итерации версий поможет сохранить жизнь Java и позволит разработчикам использовать ее более эффективно и надежно!
использованная литература
Статус, график выпуска и новые функции JDK 16
JDK 16: The new features in Java 16
Репозиторий исходного кода Java перенесен на Github
Запуск Spring Boot в образе Alpine + OpenJDK
JEP 394: Pattern Matching for instanceof
JEP 397: Sealed Classes (Second Preview)
Присоединяйтесь к нам
Добро пожаловать в команду архитекторов Tao Department, в состав которой входит множество членов, в том числе основатели Alibaba Mobile Middleware, основные члены Dubbo и группа небольших партнеров, которые любят технологии и надеются использовать их для продвижения бизнеса.
Команда архитекторов Департамента Дао продвигает обновление структуры Департамента Дао (Taobao, Tmall и т. д.) и стремится предоставлять базовые основные возможности, продукты и решения для Департамента Дао и всей группы:
Решения высокой доступности и основные возможности для бизнеса (тонкий контроль трафика Платформа Marconi: предоставляет гибкие решения высокой доступности для адаптивного управления потоками, изоляции и слияния для бизнеса, высокая доступность сайта: самовосстановление сбоев, многокомнатное и удаленное аварийное восстановление и Быстрое восстановление потока после резки
Модель нового поколения бизнес-исследований и разработок FaaS (универсальная платформа для исследований и разработок Gaia)
Внедрение и реализация сетевого протокола следующего поколения QUIC
Мобильное промежуточное ПО (API-шлюз MTop, уровень доступа AServer, сообщения/push, центр конфигурации и т. д.)
С нетерпением жду возможности принять участие в строительстве базовой платформы Taoxie~
Отправляйте свое резюме на 📮: Zebinzebin.xuzb@alibaba-inc.com(Amoy Architecture — лидер архитектуры приложений)
- Автор: Сюн Чжэн (Восемь ветров)
- Источник: Государственный отчет Департамента технологий Тао.