- PVSM.RU - https://www.pvsm.ru -
Сегодня вышла новая версия джавы — Java/JDK 13. Гонка началась с весеннего выпуска JDK 12, состоявшегося 19 марта, а форк от основной ветки произошел 13 июня. Кого-то мы там по пути потеряли вроде JEP 343: Packaging Tool [1], но в целом всё норм, и пора пожинать плоды.
Скачать новый релиз можно по ссылке [2]. Под катом будет небольшой обзор свежих JEP-ов, вошедших в этот выпуск.
Как вы знаете, в JDK 11 у нас появился новый блестящий GC — ZGC, масштабируемый, быстрый и низкопаузный. Ну или по крайней мере, такова идея. Довольно серьезной проблемой в нем было то, что он вел себя как собака на сене и не отдавал занятую память, даже если она оказалась не нужна. Shenandoah и G1 давным-давно начали делиться, и поведение ZGC выглядело преступно нерукопожатно. Ну что ж, теперь всё починено, сразу после таймаута в -XX:ZUncommitDelay
мы получаем свои байтики назад.
Сама фича CDS позволяет складывать загружаемые классы в общий архив, тем самым ускоряя запуск и уменьшая количество растрачиваемой оперативной памяти. К сожалению, раньше было как-то немного тупо, что нужно самому многократно перезапускать приложение, формируя список таких классов, а потом еще и руками дампить по этому списку. Теперь работают роботы, а не человек: когда выставлена опция -XX:ArchiveClassesAtExit
, классы сбрасываются в архив автоматически после нормальной остановки приложения.
Во всех (уже устаревших теперь) джавах, net.Socket
и java.net.ServerSocket
основываются на адской смеси Java и C-кода, от вида которого плачут даже самые закаленные теоретики перформанса. Проблему решили тем, что написали свежую реализацию, использующую ту же внутреннюю инфраструктуру, что и NIO, поэтому ей почти не нужно своего нативного кода. Ну и еще, это не легаси, написали всё красиво и пригодно к переезду на файберы из проекта Loom. Если интересно под капотом, то смотреть нужно класс NioSocketImpl
.
Продолжаем готовиться к приходу паттерн-матчинга. Switch Expressions — это первью-фича, позволяющая писать код вида:
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
Как видим в примере, со времен JDK 12 у нас есть одно косметическое изменение: break
поменяли на yield
, теперь всё как у всех нормальных людей.
JEP 326: Raw String Literals [8] отправился под нож, но дело его живёт! «Передайте товарищу Сталину — произошла чудовищная ошибка». Текстовые блоки — это новая превью-фича, которая позволяет обходиться без экранирования, она сама форматирует строки удобным образом, варит кофе с пенкой и чудесным образом даёт контроль над форматом получившейся строки.
Более приземлённо, теперь любой похапэшник без необходимости изучать JSP может написать что-то вроде:
String html = "<html>n" +
" <body>n" +
" <p>Hello, PHP!</p>n" +
" </body>n" +
"</html>n";
А начинающий DBA сможет строить карьеру, начав со следующего кода:
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'NEW DEHLI'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
Обзор JEP-ов — малая часть того, что можно и нужно рассказать про новую Java. Настоящий полный обзор должен включать ещё и всестороннее рассмотрение интересных тактических нововведений и обзор багов в багтрекере. Возможно, кто-то (lany [9], ау!) сможет продолжить эту работу. Мы с командой сейчас находимся на Oracle Code One — к сожалению, сидя на докладах или опершись о стенд Liberica JDK — довольно сложно написать что-то настолько длинное. В любом случае, это тема для совсем другого хабрапоста.
А ещё у нас есть конференция Joker, на которой можно обсудить нужность перехода на Java 13, сроки перехода на ZGC, объемы запасов попкорна, необходимых после введения Text Blocks и другие актуальные вопросы. Билеты, как всегда, можно приобрести на официальном сайте [10].
Автор: olegchir
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/330357
Ссылки в тексте:
[1] JEP 343: Packaging Tool: https://openjdk.java.net/jeps/343
[2] по ссылке: https://jdk.java.net/13/
[3] JEP 351: ZGC: Uncommit Unused Memory: https://openjdk.java.net/jeps/351
[4] JEP 350: Dynamic CDS Archives: https://openjdk.java.net/jeps/350
[5] JEP 353: Reimplement the Legacy Socket API: https://openjdk.java.net/jeps/353
[6] JEP 354: Switch Expressions: https://openjdk.java.net/jeps/354
[7] JEP 355: Text Blocks: https://openjdk.java.net/jeps/355
[8] JEP 326: Raw String Literals: https://openjdk.java.net/jeps/326
[9] lany: https://habr.com/ru/users/lany/
[10] на официальном сайте: https://jokerconf.com/registration/?utm_source=habr&utm_medium=467789&utm_campaign=joker2019
[11] Источник: https://habr.com/ru/post/467789/?utm_campaign=467789&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.