- PVSM.RU - https://www.pvsm.ru -

Java 10 General Availability

Java 10 General Availability - 1

Ссылка для скачивания: http://jdk.java.net/10/ [1].

                                                   

Последнюю полвину года мы подробно обсуждали здесь новшества Java 10 и знаем их наизусть.
Но было бы странно, если самая главная Java-новость за полгода не появилась бы в этом хабе.
Как говорится, просто оставлю это здесь. Вперёд к приключениям!

Действительно вышла в срок?

Да, действительно. Релиз сделали из 46 билда, и собрали день назад, глядите:

$ 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)

А в IDE работает, или всё красным перечёркнуто?

Работает в свежей IntelliJ IDEA. Но придётся поставить бета-версию (например, ideaIU-181.4203.400), потому что на стабильной 2017.3.5 не поддерживается этот language level.

Java 10 General Availability - 2

Долгий путь к релизу

На самом деле, нет. Это самый быстрый полноценный релиз в истории!

Раньше план публиковался на странице проекта [2], но больше он нам не понадобится. Все этапы успешно выполнены.

Java 10 General Availability - 3

И что, всё хорошо?

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

Но какой же релиз без хорошего факапа? Тагир Валеев (lany [9]) через считаные часы опубликовал в своём твиттере [10] новость об эпическом новом баге в компиляторе.

Баг уже обсуждают в рассылке [14] и ведётся работа по его починке [15].

Вот этот код, можно вставить и проверить:

public class Main {
    void m() {
        var s = java.util.List.of("a", 1);
    }
}

Проблема проявляется только только при включённом флаге -g, который говорит о необходимости генерации отладочной информации. В IDE он включён по-умолчанию, так что мимо ошибки не пройти :-)

Изменения, которые появятся в этом релизе

Java 10 General Availability - 4

JEP 286 [16]Local-Variable Type Inference [17].

Локальный вывод типов с помощью var. Неоднозначная фича. Регулярно вызывает бурления [18] в рассылке.

Пример кода:

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Бородатый анекдот в тему.
Заходит джавист в столовую и говорит: дайте, пожалуйста, Борщ борщ нью Борщ!

Java 10 General Availability - 5

JEP 296 [19]: Консолидация леса исходников JDK в едином репозитории.

Широкой общественности обычно не интересно, разве что ты собираешь OpenJDK из исходников. Интересней то, что чем меньше хаоса в проекте, тем более качественный получается продукт.

Java 10 General Availability - 6

JEP 304 [20]Garbage-Collector Interface [21].

Улучшение изоляции основных исходников от GC путём создания хорошего чистого интерфейса для GC. В последнее время стало весьма популярным писать свои GC: на подходе у нас Shenandoah, ZGC, Epsilon. Чтобы поддержать эти благие начинания, разработчикам OpenJDK пришлось конкретно разгрести свалку в коде, чтобы не только максимально упроситить создание новых GC, но и дать возможность быстро отключать ненужные GC из сборки. Один из основных критериев успеха — отсутствие просадки по перфомансу после всех этих рефакторингов.

Java 10 General Availability - 7

JEP 307 [22]Parallel Full GC for G1 [23].

CMS выбросили на мороз [24], и всё интересное в общеупотребительной (не низкопаузной) сборке мусора теперь происходит в G1. Читаем "Release Note: JEP 307: Parallel Full GC for G1" [25]: «Коллектор G1 создан для того, чтобы обходиться без full GC, но когда параллельная сборка не может утилизировать память достаточно быстро, происходит возвращение к full GC. Старая реализация full GC в G1 использовала однопоточный алгоритм mark-sweep-compact. После реализации JEP-307, full GC параллелизовался и стал использовать то же количество параллельных тредов-воркеров, как в young и mixed». (Напоминаю, что young GC обрабатывает только регионы young/survivor, mixed — ещё и old, full — весь хип, young/tenured).

Java 10 General Availability - 8

JEP 310 [26]: Application Class-Data Sharing.

Чтобы ускорить запуск и уменьшить количество используемой памяти, предлагается расширить существующую фичу под названием Class-Data Sharing («CDS») возможностью упаковки классов в общий архив.

Если совсем коротко, то вот так архив вначале создаётся, а потом используется при запуске:

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

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

Java 10 General Availability - 9

JEP 312 [27]Thread-Local Handshakes [28].

Возможность выполнять колбэк на тредах, не делая глобальный для JVM сейфпоинт. Фича позволяет дешёво останавливать одиночные треды, а не только «всё или ничего». Это низкоуровневая системная фича, вручную ей воспользоваться нельзя, но можно радоваться автомагически возросшей производительности программ.

Java 10 General Availability - 10

JEP 313 [29]: Remove the Native-Header Generation Tool.

Утилита javah больше не нужна, потому что нативные заголовки теперь может делать javac [30] (начиная с JDK8, на самом деле).

javah была утилитой, генерирующей сишные заголовочные файлы и исходники, необходимые для использования нативных методов. Сгенерированные ей файлы предназначены для использования в программах, написанных на Си, чтобы обращаться к экземплярам джавовых объектов из неуправляемого нативного кода. В .h-файле определяется структура, которая выглядит примерно как класс, которым мы собираемся управлять. Поля структуры — переменные экземпляра класса. Тем не мнее, в JNI использование подобных стабов не является обязательным.

Java 10 General Availability - 11

JEP 314 [31]Additional Unicode Language-Tag Extensions [32].

Поддержка новых расширений Unicode: cu (currency type) [33], fw (first day of week) [34], rg (region override) [35], tz (time zone) [36].

Java 10 General Availability - 12

JEP 316 [37]Heap Allocation on Alternative Memory Devices [38].

HotSpot VM теперь может выделять хиповую память на других девайсах, например, на NV-DIMM. Некоторые операционки уже умеют выделять не-DRAM память, помещая её на файловую систему, например, NTFS DAX [39] и ext4 DAX [40]. Добавляется опция ` -XX:AllocateHeapAt=.

Java 10 General Availability - 13

JEP 317 [41]Experimental Java-Based JIT Compiler [42].

Graal [43], можно использовать как основной JIT-компилятор. Объяснять, что такое Graal — очень долго, поэтому вкратце. Под брендом Graal сейчас объединено несколько направлений: Graal Compiler, SubstrateVM, Truffle, различные языки для него ("Graal polyglot runtime"). В данном случае имеется в виду именно Compiler. На некоторых тестах, типа Scala DaCapo, грааль позволяет получить почти двухкратную производительность по сравнению с C2! Чтобы получить подобные чудесные результаты, необходимо иметь очень-очень много динамического кода и очевидно, наибольшую пользу тут извлекут программисты на Scala, Groovy, JavaScript, и т.п. Работает это чудо пока что только на 64-битных Linux и macOS.

Java 10 General Availability - 14

JEP 319 [44]Root Certificates [45].

В JDK имеется кейстор [46] cacerts, который нужен для хранения корневых сертификатов. Но в OpenJDK он пока пустой. Поэтому ништяки типа TLS в OpenJDK по-умолчанию не работают. Теперь этот cacerts будет правильно сконфигурирован и заполнен, и ништяки начнут работать. Кроме того, это сгладит разницу между OpenJDK и Oracle JDK.

Java 10 General Availability - 15

JEP 322 [47]Time-Based Release Versioning [48].

Feature releases будут добавлять новые фичи. Update releases будут только чинить баги.

Ну и конечно же,

$ 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)

Не всё есть в JEP

В багтрекере и рассылке можно увидеть большое количество изменений, которые не получили такую широкую огласку, как основные JEP.

По этому поводу Тагир Валеев (lany [9]) недавно написал очень хорошую статью: https://habrahabr.ru/post/349868/ [49]. Дублировать её содержимое нет смысла, нужно пройти по ссылке и прочитать.

Что дальше?

Необходимо взять JDK 10 и начать миграцию на него своего кода!

Ссылка на загрузку: http://jdk.java.net/10/ [1].

Минутка рекламы. Как вы, наверное, знаете, мы делаем конференции. Ближайшая конференция по Java — JPoint 2018 [50]. Она пройдет 6-7 апреля 2018 года в Москве. В докладах часто упоминаются [51] вопросы перехода на новые версии Java. Какие доклады там бывают — можно посмотреть в нашем архиве на YouTube [52] или прочитать в хаброблоге [53]. Кроме того, можно будет вживую пообщаться с докладчиками и лучими экспертами по Java-платформе в специальных дискуссионных зонах после каждого доклада. Короче, заходите, мы вас ждём.

Автор: Олег Чирухин

Источник [54]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/275830

Ссылки в тексте:

[1] http://jdk.java.net/10/: http://jdk.java.net/10/

[2] план публиковался на странице проекта: http://openjdk.java.net/projects/jdk/10/

[3] Первая фаза замедления: http://openjdk.java.net/projects/jdk8/milestones#Rampdown_start

[4] All Tests Run: http://openjdk.java.net/projects/jdk8/milestones#All_Tests_Run

[5] Вторая фаза замедления: http://openjdk.java.net/projects/jdk8/milestones#Rampdown_phase_2

[6] Первый Release Candidate: http://openjdk.java.net/projects/jdk9/#Initial_Release_Candidate

[7] Окончательный Release Candidate: http://openjdk.java.net/projects/jdk8/milestones#Final_Release_Candidate

[8] General Availability: http://openjdk.java.net/projects/jdk8/milestones#General_Availability

[9] lany: https://habrahabr.ru/users/lany/

[10] в своём твиттере: https://twitter.com/tagir_valeev/status/976293600681115648

[11] #Java10: https://twitter.com/hashtag/Java10?src=hash&ref_src=twsrc%5Etfw

[12] pic.twitter.com/YJT5MqSbtm: https://t.co/YJT5MqSbtm

[13] March 21, 2018: https://twitter.com/tagir_valeev/status/976293600681115648?ref_src=twsrc%5Etfw

[14] обсуждают в рассылке: http://mail.openjdk.java.net/pipermail/compiler-dev/2018-March/011757.html

[15] ведётся работа по его починке: https://bugs.openjdk.java.net/browse/JDK-8199910

[16] JEP 286: http://openjdk.java.net/jeps/286

[17] Local-Variable Type Inference: https://medium.com/@afinlay/java-10-sneak-peek-local-variable-type-inference-var-3022016e1a2b

[18] вызывает бурления: http://mail.openjdk.java.net/pipermail/platform-jep-discuss/2016-December/000066.html

[19] JEP 296: http://openjdk.java.net/jeps/296

[20] JEP 304: http://openjdk.java.net/jeps/304

[21] Garbage-Collector Interface: https://dzone.com/articles/whats-planned-for-jdk-10

[22] JEP 307: http://openjdk.java.net/jeps/307

[23] Parallel Full GC for G1: https://bugs.openjdk.java.net/browse/JDK-8186571

[24] CMS выбросили на мороз: http://openjdk.java.net/jeps/291

[25] "Release Note: JEP 307: Parallel Full GC for G1": https://bugs.openjdk.java.net/browse/JDK-8189726

[26] JEP 310: http://openjdk.java.net/jeps/310

[27] JEP 312: http://openjdk.java.net/jeps/312

[28] Thread-Local Handshakes: https://stackoverflow.com/questions/47222819/explanation-of-the-thread-local-handshakes

[29] JEP 313: http://openjdk.java.net/jeps/313

[30] нативные заголовки теперь может делать javac: https://bugs.openjdk.java.net/browse/JDK-7150368

[31] JEP 314: http://openjdk.java.net/jeps/314

[32] Additional Unicode Language-Tag Extensions: https://bugs.openjdk.java.net/browse/JDK-8177568

[33] cu (currency type): https://www.unicode.org/repos/cldr/tags/latest/common/bcp47/currency.xml

[34] fw (first day of week): https://www.unicode.org/repos/cldr/tags/latest/common/bcp47/calendar.xml

[35] rg (region override): https://www.unicode.org/reports/tr35/tr35.html#RegionOverride

[36] tz (time zone): https://www.unicode.org/repos/cldr/tags/latest/common/bcp47/timezone.xml

[37] JEP 316: http://openjdk.java.net/jeps/316

[38] Heap Allocation on Alternative Memory Devices: https://bugs.openjdk.java.net/browse/JDK-8190308

[39] NTFS DAX: https://channel9.msdn.com/events/build/2016/p470

[40] ext4 DAX: https://lwn.net/Articles/618064

[41] JEP 317: http://openjdk.java.net/jeps/317

[42] Experimental Java-Based JIT Compiler: https://stackoverflow.com/questions/48252830/does-java-9-include-graal

[43] Graal: https://github.com/oracle/graal

[44] JEP 319: http://openjdk.java.net/jeps/319

[45] Root Certificates: https://bugs.java.com/view_bug.do?bug_id=JDK-8191486

[46] имеется кейстор: https://docs.oracle.com/javase/9/tools/keytool.htm#GUID-5990A2E4-78E3-47B7-AE75-6D1826259549__CACERTS

[47] JEP 322: http://openjdk.java.net/jeps/322

[48] Time-Based Release Versioning: https://medium.com/@bazlur_rahman/next-version-isnt-going-to-be-18-please-check-the-jep-322-http-openjdk-java-net-jeps-322-f93e81ac1dff

[49] https://habrahabr.ru/post/349868/: https://habrahabr.ru/post/349868/

[50] JPoint 2018: https://jpoint.ru/

[51] часто упоминаются: https://jpoint.ru/talks/4uhryig3nu82wa6gwioq4q/

[52] нашем архиве на YouTube: https://www.youtube.com/user/JUGRuVideo

[53] прочитать в хаброблоге: https://habrahabr.ru/company/jugru/blog/351078/

[54] Источник: https://habrahabr.ru/post/351694/?utm_source=habrahabr&utm_medium=rss&utm_campaign=351694