- PVSM.RU - https://www.pvsm.ru -
Ссылка для скачивания: 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)
Работает в свежей IntelliJ IDEA. Но придётся поставить бета-версию (например, ideaIU-181.4203.400
), потому что на стабильной 2017.3.5
не поддерживается этот language level.
На самом деле, нет. Это самый быстрый полноценный релиз в истории!
Раньше план публиковался на странице проекта [2], но больше он нам не понадобится. Все этапы успешно выполнены.
В основном, да. В этом релизе разработчики фокусировались на починке только тех багов, которые являются совершенно критичными для успеха Java 10. Все задачи, относящиеся к другим релизам Java, даже с высшим приоритетом, отложены.
Но какой же релиз без хорошего факапа? Тагир Валеев (lany [9]) через считаные часы опубликовал в своём твиттере [10] новость об эпическом новом баге в компиляторе.
Баг уже обсуждают в рассылке [14] и ведётся работа по его починке [15].
Вот этот код, можно вставить и проверить:
public class Main {
void m() {
var s = java.util.List.of("a", 1);
}
}
Проблема проявляется только только при включённом флаге -g
, который говорит о необходимости генерации отладочной информации. В IDE он включён по-умолчанию, так что мимо ошибки не пройти :-)
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>
Бородатый анекдот в тему.
Заходит джавист в столовую и говорит: дайте, пожалуйста, Борщ борщ нью Борщ!
JEP 296 [19]: Консолидация леса исходников JDK в едином репозитории.
Широкой общественности обычно не интересно, разве что ты собираешь OpenJDK из исходников. Интересней то, что чем меньше хаоса в проекте, тем более качественный получается продукт.
JEP 304 [20]: Garbage-Collector Interface [21].
Улучшение изоляции основных исходников от GC путём создания хорошего чистого интерфейса для GC. В последнее время стало весьма популярным писать свои GC: на подходе у нас Shenandoah, ZGC, Epsilon. Чтобы поддержать эти благие начинания, разработчикам OpenJDK пришлось конкретно разгрести свалку в коде, чтобы не только максимально упроситить создание новых GC, но и дать возможность быстро отключать ненужные GC из сборки. Один из основных критериев успеха — отсутствие просадки по перфомансу после всех этих рефакторингов.
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).
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
JEP 312 [27]: Thread-Local Handshakes [28].
Возможность выполнять колбэк на тредах, не делая глобальный для JVM сейфпоинт. Фича позволяет дешёво останавливать одиночные треды, а не только «всё или ничего». Это низкоуровневая системная фича, вручную ей воспользоваться нельзя, но можно радоваться автомагически возросшей производительности программ.
JEP 313 [29]: Remove the Native-Header Generation Tool.
Утилита javah
больше не нужна, потому что нативные заголовки теперь может делать javac [30] (начиная с JDK8, на самом деле).
javah
была утилитой, генерирующей сишные заголовочные файлы и исходники, необходимые для использования нативных методов. Сгенерированные ей файлы предназначены для использования в программах, написанных на Си, чтобы обращаться к экземплярам джавовых объектов из неуправляемого нативного кода. В .h-файле определяется структура, которая выглядит примерно как класс, которым мы собираемся управлять. Поля структуры — переменные экземпляра класса. Тем не мнее, в JNI использование подобных стабов не является обязательным.
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].
JEP 316 [37]: Heap Allocation on Alternative Memory Devices [38].
HotSpot VM теперь может выделять хиповую память на других девайсах, например, на NV-DIMM. Некоторые операционки уже умеют выделять не-DRAM память, помещая её на файловую систему, например, NTFS DAX [39] и ext4 DAX [40]. Добавляется опция ` -XX:AllocateHeapAt=.
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.
JEP 319 [44]: Root Certificates [45].
В JDK имеется кейстор [46] cacerts
, который нужен для хранения корневых сертификатов. Но в OpenJDK он пока пустой. Поэтому ништяки типа TLS в OpenJDK по-умолчанию не работают. Теперь этот cacerts
будет правильно сконфигурирован и заполнен, и ништяки начнут работать. Кроме того, это сгладит разницу между OpenJDK и Oracle JDK.
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.
По этому поводу Тагир Валеев (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
Нажмите здесь для печати.