Компания Oracle опубликовала Java SE 12

После шести месяцев разработки компания Oracle выпустила платформу Java SE 12 (Java Platform, Standard Edition 12), в качестве эталонной реализации которой используется открытый проект OpenJDK. В Java SE 12 сохранена обратная совместимость с прошлыми выпусками платформы Java, все ранее написанные Java-проекты без изменений будут работоспособны при запуске под управлением новой версии. Готовые для установки сборки Java SE 12 (JDK, JRE и Server JRE) подготовлены для Linux (x86_64), Solaris (SPARC), Windows и macOS. Разработанная в рамках проекта OpenJDK эталонная реализация Java 12 полностью открыта под лицензией GPLv2 с исключениями GNU ClassPath, разрешающими динамическое связывание с коммерческими продуктами.

Java SE 12 отнесён к категории выпусков с обычным сроком поддержки, обновления для которого будут выпускаться до следующего релиза. В качестве ветки с длительным сроком поддержки (LTS) следует использовать Java SE 11, обновления для которого будут выпускаться до 2026 года. Прошлая LTS-ветка Java 8 будет поддерживаться до декабря 2020 года. Следующий LTS-релиз намечен на сентябрь 2021 года. Напомним, что начиная с выпуска Java 10 проект перешёл на новый процесс разработки, подразумевающий более короткий цикл формирования новых релизов. Новая функциональность теперь развивается в одной постоянно обновляемой master-ветке, в которую включаются уже готовые изменения и от которой раз в шесть месяцев ответвляются ветки для стабилизации новых выпусков.

Из новшеств Java 12 можно отметить:

  • Добавлена экспериментальная поддержка сборщика мусора Shenandoah, работающего с минимальными приостановками (Low-Pause-Time Garbage Collector). Планировщик развивается компанией Red Hat и примечателен использованием алгоритма, сокращающего время остановок во время сборки мусора за счёт проведения чистки параллельно с выполнением Java-приложений. Размер вносимых сборщиком мусора задержек предсказуем и не зависит от размера кучи, т.е. для куч в 200 MB и 200 GB задержки будут идентичны (не выходят за пределы 50 мс и обычно укладываются в 10 мс);
  • В состав включён набор для проведения точечных тестов производительности (microbenchmark), позволяющий организовать непрерывное тестирование производительности различных компонентов кодовой базы и упрощающий добавление собственных тестов;
  • Обеспечена предварительная поддержка новой формы выражений «switch», не требующей использования оператора «break» и позволяющей объединять повторяющиеся метки. Например, вместо
         switch (day1) {         case MONDAY:         case FRIDAY:         case SUNDAY:             System.out.println(6);             break;     ...     int numLetters;     switch (day2) {         case MONDAY:         case FRIDAY:         case SUNDAY:             numLetters = 6;             break;     ...  
    новые выражения позволяют указать
         switch (day1) {         case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);     ...     int numLetters = switch (day2) {      case MONDAY, FRIDAY, SUNDAY -> 6;     ...  
  • Представлен API JVM Constants (java.lang.invoke.constant), позволяющий описать все типы загружаемых констант, используемых в файлах с Java-классами и в компонентах runtime;
  • Добавлена поддержка компактного форматирования чисел (NumberFormat.Style.SHORT). Например, вместо 1000 может быть выведено »1K», а вместо 1000000 — »1M»;
  • Добавлен новый флаг »-XX:+ExtensiveErrorReport» для вывода более детальных сведений об ошибках в случае краха приложения;
  • В реализацию TLS добавлена поддержка потокового шифра ChaCha20 и алгоритма аутентификации сообщений (MAC) Poly1305;
  • Предложен один унифицированный порт для архитектуры AArch64 (ранее развивалось два порта aarch64 и arm64, теперь оставлен только порт aarch64);
  • По умолчанию на основе предлагаемого по умолчанию списка классов в процессе сборки JDK обеспечена генерация архивов CDS (Class-Data Sharing), обеспечивающих совместный доступ приложений к общим классам. При помощи CDS общие классы могут размещаться в отдельном совместно используемом архиве, что позволяет ускорить запуск приложений и снизить накладные расходы. Предоставление архивов CDS сокращает время запуска и позволяет избавить пользователей от выполнения »-Xshare: dump» для создания CDS;
  • В сборщик мусора G1 добавлена поддержка отменяемой чистки смешанных коллекций (Abortable Mixed Collections), позволяющая оборвать процесс необязательной стадии чистки, если превышено максимальное время приостановки на сборку мусора;
  • В сборщике мусора G1 реализована возможность возвращения операционной системе неиспользуемых областей памяти при неактивности приложения.
  • В сборщиках мусора G1 и Parallel появилась возможность выноса старых данных из кучи на альтернативные устройства памяти, такие как NV-DIMM;
  • В сборщик мусора ZGC (Z Garbage Collector) добавлена возможность выгрузки неиспользуемых классов (class unloading) для высвобождения занимаемых ими структур данных. Выгрузка производится в параллельном потоке и не влияет на выполнение Java-программ;
  • Для Linux реализован новый опциональный механизм запуска процессов POSIX_SPAWN (jdk.lang.Process.launchMechanism = POSIX_SPAWN), позволяющий обойти некоторые редко возникающие проблемы при ответвлении дочерних процессов. По умолчанию продолжает применяться механизм VFORK;
  • Отмечается, что библиотека Swing (client-libs/javax.swing) ограничена поддержкой только старых выпусков GTK, использование версии 3.20 и новее приводит к проблемам при отрисовке некоторых элементов интерфейса. При наличии в системе новых версий GTK в качестве обходного пути рекомендуется запускать приложения с опцией »-Djdk.gtk.version=2.2» для отката на GTK2+.

© OpenNet