Официально выпущена Java 10, включая 109 новых функций

Java задняя часть открытый источник Oracle
Автор|Чжан Цзяньфэн Редактор|Го Лэй

21 марта по пекинскому времени Oracle официально объявила об официальном выпуске Java 10. Это первый официальный выпуск Java после основных изменений цикла версий (подробности см. здесь), и он очень достоин внимания. Вы можете нажать на следующий адрес для немедленной загрузки:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

В сентябре прошлого года Oracle скорректировала цикл основных версий Java с первоначальных двух-трех лет до выпуска основной версии каждые шесть месяцев. Номер версии по-прежнему продолжает исходный серийный номер, а именно Java 8, Java 9, Java 10, Java 11...

Но в отличие от предыдущего, здесь также есть номер версии, указывающий время выпуска и является ли это LTS (версия с долгосрочной поддержкой), например, Java 10 соответствует 18.3. Следующий пример:

/jdk-10/bin$ ./java -version

openjdk version "10" 2018-03-20

OpenJDK Runtime Environment 18.3 (build 10+46)

OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)скопировать код

Обратите внимание, что ни Java 9, ни Java 10 не являются версиями LTS. В отличие от предыдущих крупных обновлений версии Java, эти две имеют период разработки и обслуживания всего около полугода. Будущая версия Java 11, то есть 18,9 LTS, станет первой LTS-версией после Java 8 (с долгосрочными услугами поддержки от коммерческих компаний, таких как Oracle).

Эта модель выпуска получила широкое распространение, удачным примером является операционная система Ubuntu Linux, версия выпуска в четном апреле — LTS, которая будет поддерживаться в течение длительного времени. Поскольку в апреле 2014 года была выпущена версия 14.04 LTS, компания Canonical и сообщество поддерживают ее до 2019 года. Точно так же Node.js, ядро ​​​​Linux и Firefox также используют аналогичные методы распространения.

В будущем цикле выпуска Java основная версия будет выпускаться каждые шесть месяцев, а промежуточная функциональная версия будет выпускаться каждый квартал. Таким образом, некоторые ключевые функции могут быть включены в JDK как можно скорее, а разработчики могут быстро получать отзывы, что может в определенной степени избежать смущения, связанного с тем, что Java 9 вынужден дважды откладывать дату выпуска.

На следующем рисунке показан цикл выпуска и поддержки будущих версий Java, раскрытый Oracle на конференции JavaOne 2017 года.

Что нового в Java 10

В этом выпуске Java 10 не так много новых функций.

Согласно общедоступной информации на официальном веб-сайте, всего существует 12 JEP (предложений по улучшению функций JDK Enhancement Proposal), которые вносят следующие улучшения:

  1. JEP286, вывод типа локальной переменной var.

  2. JEP296 объединяет множество кодов складов JDK, изначально управляемых Mercurial, в один склад, упрощая процесс разработки и управления.

  3. JEP304, унифицированный интерфейс сборки мусора.

  4. JEP307, параллельная полная сборка мусора для сборщика мусора G1, реализует параллелизм для уменьшения задержки в наихудшем случае.

  5. JEP310, совместное использование данных классов приложений (AppCDS), сокращает объем памяти и время запуска за счет совместного использования общих метаданных классов между процессами.

  6. JEP312, взаимодействие рукопожатия ThreadLocal. Выполнение обратных вызовов в потоках без входа в глобальную точку безопасности JVM. Вместо того, чтобы останавливать все потоки или ни один из них, оптимизация может остановить только один поток.

  7. JEP313, удалите инструмент javah, поставляемый с JDK. Вместо этого вы можете использовать javac -h.

  8. JEP314, используйте дополнительные расширения языковой разметки Unicode.

  9. JEP317, который может выделять место в куче для указанного пользователем резервного устройства памяти.

  10. JEP317, используя компилятор Graal на основе Java, может прекомпилировать код Java в собственный код для повышения производительности.

  11. JEP318 предоставляет набор сертификатов корневого центра сертификации по умолчанию в OpenJDK. Откройте исходный код корневого сертификата Java SE, который в настоящее время предоставляется Oracle, чтобы разработчикам было удобнее использовать OpenJDK.

  12. JEP322, версия выпуска, определяемая на основе времени, то есть цикла выпуска, упомянутого выше. Номер версии: \$FEATURE.\$INTERIM.\$UPDATE.\$PATCH, то есть основная версия, промежуточная версия, пакет обновления и версия исправления.

Часть описания функции

1. вывод типа var.

Эта языковая функция уже добавлена ​​в некоторые другие языки (C#, JavaScript) и некоторые языки на основе JRE (Scala и Kotlin).

Предложение JEP286, рассматриваемое очень рано для языка Java, было официально представлено еще в 2016 году. Публичный опрос разработчиков был проведен позже, и главной рекомендацией для Scala-подобного подхода было «использовать и val, и var» — около половины; второй наиболее рекомендуемой была «просто использовать var» — около четверти. Позже, после тщательного рассмотрения, корпорация Oracle приняла схему, в которой используется только ключевое слово var.

С этой функцией, когда разработчики пишут такой код:

ArrayList<String> myList = new ArrayList<String>()скопировать код

Предыдущее объявление типа можно опустить, и только

var list = new ArrayList<String>()скопировать код

Компилятор автоматически определит тип переменной списка. Это также было бы удобно для связанных выражений:

var stream = blocks.stream(); 

... 

int maxWeight = stream.filter(b -> b.getColor() == BLUE)

                      .mapToInt(Block::getWeight)

                      .max();скопировать код

Разработчикам не нужно объявлять и импортировать тип Stream, а использовать stream только как промежуточную переменную и использовать ключевое слово var для повышения эффективности разработки.

Однако использование var имеет много ограничений, в том числе то, что его нельзя использовать для вывода типа параметров метода, его можно использовать только в локальных переменных, таких как блоки методов, и нельзя использовать в объявлении переменных класса. и так далее.

Кроме того, лично я считаю, что для разработчиков очевидное объявление типов переменных предоставит более полную информацию о языке программирования, что очень поможет в понимании и сопровождении кода. Как только переменная var станет широко использоваться, разработчики, читающие сторонний код без поддержки IDE, будут создавать определенные препятствия для понимания выполнения потока программы. Так что предлагаю писать тип переменной как можно понятнее, а читабельность и ремонтопригодность программы иногда важнее.

2. Единый интерфейс ГХ

В коде JDK10 путь — openjdk/src/hotspot/share/gc/, и каждая реализация GC разделяет и зависит от общего кода.GC включает текущий G1 по умолчанию, а также классические Serial, Parallel, CMS и другие Реализации ГК.

3. Совместное использование данных класса приложений (AppCDS)

Функция CDS расширяет поддержку CDS (Application Class-Data Sharing) класса приложения на основе исходного класса начальной загрузки.

Принцип таков: запишите процесс загрузки класса при запуске, запишите его в текстовый файл, и непосредственно прочитайте текст запуска и загрузите его, когда он снова запустится. Представьте, если не будет серьезных изменений в среде приложения, скорость запуска улучшится.

Мы можем представить это как процесс гибернации, аналогичный операционной системе: когда компьютер закрывается, текущая среда приложения записывается на диск, и среда может быть быстро восстановлена ​​при повторном использовании.

Я провожу следующие эксперименты по запуску приложений на своем ПК.

Сначала разверните сервер приложений wildfly 12, используя предварительную версию JDK10 в качестве среды Java. Кроме того, необходимо использовать инструмент cl4cds[1], который используется для преобразования записей журнала загруженных классов в формат, распознаваемый AppCDS.

A. Установите wildfly и разверните приложение с Angularjs, отдыхом, полным стеком технологий приложений jpa, запустите три раза после прогрева и запишите время завершения развертывания.

Они составляют 6716 мс, 6702 мс, 6613 мс соответственно, а среднее время составляет 6677 мс.

B. Добавьте переменные среды и запустите, экспортируйте журнал запуска

export PREPEND_JAVA_OPTS="-Xlog:class+load=debug:file=/tmp/wildfly.classtrace"скопировать код

C. Используйте инструмент cl4cds для создания формата cls, который может распознать AppCDS.

/jdk-10/bin/java -cp src/classes/ io.simonis.cl4cds /tmp/wildfly.classtrace /tmp/wildfly.clsскопировать код

Откройте файл, и вы увидите, что содержимое:

java/lang/Object id: 0x0000000100000eb0

java/io/Serializable id: 0x0000000100001090

java/lang/Comparable id: 0x0000000100001268

java/lang/CharSequence id: 0x0000000100001440

......

org/hibernate/type/AssociationType id: 0x0000000100c61208 super: 0x0000000100000eb0 interfaces: 0x0000000100a00d10 source: /home/shihang/work/jboss/wildfly/dist/target/wildfly-12.0.0.Final/modules/system/layers/base/org/hibernate/main/hibernate-core-5.1.10.Final.jar

org/hibernate/type/AbstractType id: 0x0000000100c613e0 super: 0x0000000100000eb0 interfaces: 0x0000000100a00d10 source: /home/shihang/work/jboss/wildfly/dist/target/wildfly-12.0.0.Final/modules/system/layers/base/org/hibernate/main/hibernate-core-5.1.10.Final.jar

org/hibernate/type/AnyType id: 0x0000000100c61820 super: 0x0000000100c613e0 interfaces: 0x0000000100c61030 0x0000000100c61208 source: /home/shihang/work/jboss/wildfly/dist/target/wildfly-12.0.0.Final/modules/system/layers/base/org/hibernate/main/hibernate-core-5.1.10.Final.jar

....скопировать код

Этот файл используется для маркировки информации о загрузке класса.

D. Запустите wildfly с переменными среды, смоделируйте процесс запуска и экспортируйте файл jsa, который должен записывать информацию о классе при запуске.

export PREPEND_JAVA_OPTS="-Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=/tmp/wildfly.cls -XX:+UnlockDiagnosticVMOptions -XX:SharedArchiveFile=/tmp/wildfly.jsa"скопировать код

Просмотрите информацию о сгенерированном файле, файл jsa имеет больший размер.

/opt/work/cl4cds$ ls -l /tmp/wildfly.*

-rw-rw-r-- 1 shihang shihang   8413843 Mar 20 11:07 /tmp/wildfly.classtrace

-rw-rw-r-- 1 shihang shihang   4132654 Mar 20 11:11 /tmp/wildfly.cls

-r--r--r-- 1 shihang shihang 177659904 Mar 20 11:13 /tmp/wildfly.jsaскопировать код

E. Запустите сервер приложений с помощью файла jsa

export PREPEND_JAVA_OPTS="-Xshare:on -XX:+UseAppCDS -XX:+UnlockDiagnosticVMOptions -XX:SharedArchiveFile=/tmp/wildfly.jsa"скопировать код

После завершения запуска время записи составляет 5535 мс, 5333 мс, 5225 мс три раза, а среднее значение составляет 5364 мс.По сравнению с предыдущими 6677 мс можно подсчитать, что время запуска увеличилось примерно на 20%.

Это повышение эффективности полезно для развертывания облачных приложений.

Вышеупомянутые экспериментальные методы относятся к техническому блогу [2].

4. JEP314, использование дополнительных расширений языковой разметки Unicode.

JDK10 имеет большую поддержку Unicode BCP 47, документа спецификации для набора языков, определенного IETF. Используя расширенные теги, удобнее получить требуемое окружение локали.

Например, метод, добавленный JDK10,

java.time.format.DateTimeFormatter::localizedByскопировать код

Таким образом, для получения информации о локали, необходимой для информации о времени, можно использовать определенный числовой шаблон, определение локали или часовой пояс.

Приложение: По ссылке [3] вы можете увидеть все изменения уровня метода JDK10.

5. Просмотрите текущий корневой сертификат управления JDK.

Добавьте параметр -cacerts в keytool начиная с JDK9, вы можете просмотреть корневой сертификат, управляемый текущим JDK. В OpenJDK9 cacerts пуст, что принесет много изменений разработчикам.

EP318 использует Oracle для открытия исходного кода информации о cacerts в Oracle JavaSE и предоставляет набор сертификатов корневого центра сертификации по умолчанию в OpenJDK.В настоящее время существует 80 записей.

/jdk-10/bin$ ./keytool -list -cacerts

Enter keystore password:  

Keystore type: JKS

Keystore provider: SUN



Your keystore contains 80 entries



verisignclass2g2ca [jdk], Dec 2, 2017, trustedCertEntry, 

Certificate fingerprint (SHA-256): 3A:43:E2:20:FE:7F:3E:A9:65:3D:1E:21:74:2E:AC:2B:75:C2:0F:D8:98:03:05:BC:50:2C:AF:8C:2D:9B:41:A1

......скопировать код

Прогноз на следующую версию

Следующей основной версией Java станет Java 11, LTS-версия после Java 8, выпуск которой ожидается в сентябре этого года. В настоящее время существует только четыре JEP, и постепенно будут добавляться новые предложения по улучшению.

В этой версии будут полностью реализованы возможности модульности, удалены части, касающиеся JavaEE и Corba, из текущего JDK, и она станет более компактной.

В то время как самой большой особенностью JDK9 является модульность, широкое признание в индустрии Java и адаптация требуют процесса. Уже есть некоторые библиотеки, поддерживающие модульность, такие как log4j2, но большинство из них еще не поддерживает.

Можно предвидеть, что после выпуска JDK11 функция модульности станет функцией долгосрочной поддержки, и все больше и больше библиотек классов будут поддерживать модульность.

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

Спасибо оригинальному автору статьи, процитированной в статье! Приведенные рисунки, данные и методы принадлежат первоначальным авторам.

[1]: https://simonis.github.io/cl4cds/

[2]: https://marschall.github.io/2018/02/18/wildfly-appcds.html

[3]: https://gunnarmorling.github.io/jdk-api-diff/jdk9-jdk10-api-diff.html#java.time.format.DateTimeFormatter

об авторе

Чжан Цзяньфэн, соучредитель Yongyuan Middleware, бывший член группы разработки ядра сервера приложений Red Hat JBoss. Окончил Пекинский университет почты и телекоммуникаций и Университет Цинхуа, работал в Kingsoft, IONA Technology и Red Hat Software.

Знаком с различными спецификациями JavaEE; энтузиасты технологий с открытым исходным кодом любят связываться с различными проектами с открытым исходным кодом, узнавать отличные моменты и учиться у них, и думают, что читать хороший исходный код так же приятно, как читать хорошую книгу; в распределенном Он имеет богатую практическую опыт и собственное мнение в технических областях, таких как вычислительная техника, разработка корпоративных приложений, приложения для мобильных устройств, DevOps и т. д., готовность думать об идеях управления, стоящих за программным обеспечением, и думать, что программные технологии являются эффективным методом управления в сочетании с программным обеспечением разработка.