JavaRush/Java блог/Java Developer/Java 12 уже здесь: что нового?

Java 12 уже здесь: что нового?

Статья из группы Java Developer
участников
Итак, появилась Java под номером 12. И пускай это не LTS-релиз (то есть, не Long term support, не тот релиз, который будет долго поддерживаться. Первым LTS-релизом с восьмилетним сроком поддержки считается 11 версия), в нём появились интересные обновления. Рассмотрим самые важные из них. Напомним, в Java предложения по изменению сокращённо называют jep’ами (от JDK Enhancement Proposal). Java 12 уже здесь: что нового? - 1

Самые интересные Jep’ы JDK 12

189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) В сборщике мусора (Garbage Collector) по имени Shenandoah применён новый алгоритм, который сокращает время работы, поскольку занимается “чисткой” одновременно с запущенными потоками Java. При этом время паузы в Shenandoah будет одинаковым независимо от размера кучи (heap). Oracle почему-то не включила Sheandoah в свои “официальные” релизные сборки, невзирая на то, что разработчики считают эту фичу одной из важнейших в новом релизе. Так что если вы планируете опробовать продвинутый Garbage Collector, нужно использовать сборки сторонних компаний, например, Azul. 230: Microbenchmark Suite Microbenchmark — это микротест, который измеряет производительность какого-то небольшого элемента. В Java их пишут и запускают с помощью фреймворка JMH. Начиная с 12 версии JMH была добавлена в JDK, и уже есть тесты, которые написаны на нём, что упрощает жизнь разработчикам. 325: Switch Expressions (Preview) Новая форма написания выражения с оператором switch. На странице фичи приводится пример кода с традиционным использованием switch, где постоянное использование break делает его излишне многословным, что приводит к частым случайным ошибкам.
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Авторы обновления предлагают ввести новую форму метки switch “case L ->” чтобы очевидным образом показать, что выполнятся будет только код справа от метки, если эта метка – подходящая. Так, код, показанный выше с помощью нового синтаксиса можно существенно сократить:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
334: JVM Constants API В пуле констант располагаются так называемые loadable constants. Это значения, например типа String или любого примитивного типа, а также run-time артефакты, такие как классы и методы. Во время работы с класс-файлами, программистам не помешали бы удобные инструменты для манипуляции с loadable constants. Авторы этого jep’а принялись решать эту проблему с помощью введения новых value-based типов символических ссылок, при этом каждая из них будет описывать конкретный вид констант. Код нововведения. 340: One AArch64 Port, Not Two Под этим сложным названием скрывается решение проблемы, образовавшейся ещё в Java 9, когда в ките появились 64-битные ARM-порты Oracle и aarch64 от Red Hat одновременно. При этом уже во время выхода JDK 11, 64-битную версию портов Oracle не поддерживала даже сама Oracle. Так что теперь 64-битные порты Oracle убрали, остались 32-битные ARM32, и 64-битные, более производительные, aarch64. 341: Default CDS Archives Очень приятное обновление, поскольку оно реально ускоряет запуск приложений. Не секрет, что при старте Java-приложения начинает загрузку огромное количество классов, а это достаточно длительный процесс. CDS расшифровывается как Class Data Sharing, и эта функция позволяет упаковать все эти запускаемые при старте классы в специальный class data sharing архив, используя дефолтный список этих самых классов. В результате скорость запуска приложений существенно возрастает. 344: Abortable Mixed Collections for G1 G1 — это сборщик мусора, который стал основным в JDK 9, сменив на этом посту Parallel GC. В Java 10 G1 научился собирать мусор в нескольких потоках. Однако его работой были довольны не все, одной из главных проблем оказались длительные паузы. Теперь их можно отменить. G1 на основе анализа поведения программы определяет объем работы, а затем собирает “живые” объекты в Collection set пока не соберёт все, не останавливаясь. Часто G1 промахивался с подсчётом объёма работы и работал слишком долго. После внедрения jep-344 G1 может перейти на пошаговую сборку мусора и если время выполнения следующего шага выходит за рамки разумного, этот шаг можно прервать. 346: Promptly Return Unused Committed Memory from G1 И ещё немного обновлений в стане вышеупомянутого сборщика G1. Порой бывало, что куча Java heap memory есть, а её, эту память, никто не использует. Теперь в Java 12 можно “вернуть” неактивную память в операционную систему. Раньше добиться от G1 отдать память можно было очень редко, теперь всё упростилось. С новой фичей приложение определяется как неактивное если закончился интервал с последней сборки и нет concurrent cycle. Другая ситуация — если или если функция getloadavg(), работу которой отслеживали в течение какого-то времени, показывает нагрузку ниже установленного допустимого порога. Если произошло одно из двух событий, начинается частичная сборка мусора. Чего в Java 12 нет: Raw String Literals Многие разработчики с интересом отнеслись к этой функции, однако она так и не появилась в данном релизе. Её авторы решили, что над ней ещё нужно поработать. Так что, смеем надеяться, функция удобной работы со строковыми литералами появится в одной из ближайших версий Java. Поддержка необработанных строковых литералов позволяет работать со строковой информацией независимо от языка. Это устраняет необходимость в экранировании. Особенно полезно в регулярных выражениях, где широко используется обратный слэш и в Windows-path, где слэш используется в качестве разделителя. То есть во избежание таких конструкций: C:\\My\\Test\\Pack\\
Каждый программист часто сталкивается с теми или иными сложностями при работе. Иногда они связаны с неопытностью разработчика, но порой — с неидеальностью самого инструмента. Java — классный язык, но далеко не идеальный. Возможно, вы уже столкнулись с чем-то в Java, и знаете, что хотели бы изменить в вашем “инструменте” (языке)? Делитесь в комментариях!

Выводы

Никакой революции в Java 12 не произошло. Впрочем, её никто и не планировал. Однако ряд нововведений направлен на оптимизацию работы приложений и ускорение работы, что не может не радовать. Кстати, IDEA уже поддерживает JDK 12, так что вы вполне можете опробовать её возможности. Разумеется, мало какие обновления касаются новичков непосредственно, хотя поиграться с новым switch (предварительно установив флаг --enable-preview) может даже тот, кто только начал обучение на JavaRush.
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Yura Zolotar
Уровень 1
23 марта 2019, 14:21
Ну и зачем мне знать про 41 уровень, если я "буксую" где-то вначале (уж очень тяжело даются "жиденькие без разжёвывания" новые знания в 45 то лет)???? Это что бы бежать впереди паровоза????
JD Backend Developer в EPAM
24 марта 2019, 14:52
если вы решили начать, то важно не только фичи кода знать и следить за обновлениями и новостями в этой сфере) это + новые знания. так же помогает отвлечься)
Александр
Уровень 5
28 марта 2019, 08:54
Согласен. подача информации перед задачами очень не последовательна. Сам бросил временно. Если все же планируете освоить этот язык - рекомендую книжки "Изучаем Java" например. Там лучше все раскладывают по полочкам. А потом уже здесь чисто из за практических упражнений продолжать)
Deniaslom
Уровень 0
22 марта 2019, 04:18
Ай, пока и jdk 8 в обучении хватает
naut92
Уровень 29
21 марта 2019, 15:06
опять не сделали перезагрузку изменений в классах в дебаге. Сигнатуры методов так и невозможно изменить без перезапуска приложения! Это очень и очень замедляет разработку! После каждого чиха приходится перезапускаться. Работал на проекте, там приложение стартовало 5 минут!! 3-4 раза перезапустился - уже обед. Никакой революции не произошло уж точно!
Стас Пасинков Software Developer в Zipy Master
27 марта 2019, 15:58
изучите вашу иде. в идее можно менять код в дебаге "на лету". только после изменения в одном классе - перекомпилил его и все. все приложение рестартовать не обязательно
hidden #2041214
Уровень 6
5 апреля 2019, 18:40
Да, но только если не менять сигнатуру методов)
Стас Пасинков Software Developer в Zipy Master
8 апреля 2019, 14:08
аа, да, не обратил внимание, что вопрос именно про смену сигнатур методов))) тогда перезапускать дебаг приходится, да)
NodeOne
Уровень 41
Expert
21 марта 2019, 10:20
java 11 стала платной, 12 вероятно тоже скромно содержит в лицензионном соглашении какие нибудь оговорки, что разработчики все больше должны Oracle?
Philip J. Backend Developer Expert
21 марта 2019, 10:25
java не стала платной, платной стала сборка JDK от oracle, и то, только для продакшна, для любых других целей всё по-прежнему бесплатно. Кроме этого, существует куча свободных сборок, хотя бы тот же OpenJDK
Александр Палеков process adjustment engine в vpkits
21 марта 2019, 10:14
okay...
Рагнарёк
Уровень 8
21 марта 2019, 10:00
Ммм... Понятно
Серёжа Гресинг
Уровень 18
21 марта 2019, 09:59
что насчет ссылки на хабр?
Hanna Moruga Chief editor @ JavaRush
21 марта 2019, 13:25
Сергей, здравствуйте! Спасибо за ссылку на подробный обзор. Наш материал, так же как и материал с Хабра, подготовлен на основе первоисточника: примеры кода взяты из jep'ок. Ссылки на них указаны в тексте :)