Итак, появилась Java под номером 12. И пускай это не LTS-релиз (то есть, не Long term support, не тот релиз, который будет долго поддерживаться. Первым LTS-релизом с восьмилетним сроком поддержки считается
11 версия), в нём появились интересные обновления. Рассмотрим самые важные из них. Напомним, в Java предложения по изменению сокращённо называют jep’ами (от JDK Enhancement Proposal).
Самые интересные 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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ