Java SE 25 отнесён к выпускам с расширенным сроком поддержки, обновления для которого будут выпускаться до 2033 года (общедоступные обновления будут выходить до сентября 2030 года). В качестве ветки с длительным сроком поддержки (LTS) также продолжают сопровождаться ветки Java SE 17 и 21, обновления для которой будут выпускаться до 2029 и 2031 годов, соответственно (общедоступные - до 2026 и 2028 годов). Расширенная поддержка LTS-веток Java SE 8 и 11 продлится до 2030 и 2032 годов.
Среди предложенных в Java SE 25 новшеств (1, 2, 3, 4):
- Предложен компактный вариант оформления программ, который может оказаться полезным для обучения и при разработке небольших приложений. В компактной форме не требуется определение лишних классов, автоматически импортируются типовые API и доступны упрощённые методы ввода/вывода. Например, приложение "Hello, World!" можно свести к:
Код:
void main() {
IO.println("Hello, World!");
} - Добавлена возможность использования одного выражения "import module M" для импорта сразу всех пакетов, экспортируемых указанным модулем. Изменение существенно упрощает повторное использование модульных библиотек, позволяя подключать библиотеки и классы без определения их места в иерархии пакетов. Например, указание "import module java.base" приведёт к импорту всех 54 пакетов, входящих в модуль java.base, которые ранее потребовалось бы упоминать по-отдельности ("import java.io.*", "import java.util.*" и т.п.).
- Добавлен поколенческий (generational) режим работы сборщика мусора Shenandoah, при котором раздельно обрабатываются старые и недавно созданные объекты для повышения эффективности очистки объектов с небольшим временем жизни. Новый режим обеспечивает более предсказуемую пропускную способность, устойчивость к изменению нагрузки и снижение потребления памяти при сборке мусора. Планировщик Shenandoah нацелен на сокращение времени остановок во время сборки мусора за счёт проведения большего объёма работ параллельно с выполнением Java-приложений.
- Добавлен экспериментальный API StableValue для работы с объектами, содержащими неизменяемые данные и обрабатываемыми в JVM как константы. К подобным объектам применяются оптимизации производительности, аналогичные полям с ключевым словом "final". API StableValue, в отличие от "final", разделяет создание постоянных значений и их инициализацию, гарантирует, что значение может быть инициализировано только один раз, сокращает время запуска программ и позволяет применять в пользовательском коде оптимизации сворачивания констант (constant-folding), ранее использовавшиеся только во внутреннем коде JDK.
Код:
class Application {
// Было:
// static final UserService USERS = new UserService();
// Теперь можно:
static final StableValue‹UserService› USERS = StableValue.of();
public static UserService users() {
return USERS.orElseSet(UserService::new);
}
} - Добавлен экспериментальный API для кодирования и декодирования объектов с криптографическими ключами, сертификатами и списками отозванных сертификатов, используя формат PEM (Pivacy-Enhanced Mail).
- Добавлена поддержка ограниченных значений (Scoped Values), позволяющих совместно использовать неизменяемые данные в потоках и эффективно обмениваться данными между дочерними потоками (значения наследуются). Scoped Values создан для замены механизма переменных локальных к потоку (thread-local variables) и более эффективен при использовании очень большого числа виртуальных потоков (тысячи и миллионы потоков). Главное отличие Scoped Values от переменных локальных к потоку в том, что первые записываются один раз, в дальнейшем не могут быть изменены и остаются доступны только на время выполнения потока.
- Добавлен API для использования криптографических функций формирования ключа (KDF, key derivation function), позволяющих сформировать дополнительные ключи необходимой длины на основе секретного ключа (например, пароля) и произвольного набора данных.
- Разрешено указание в конструкторах выражений перед вызовом super(...), используемом для явного вызова конструктора родительского класса из конструктора наследуемого класса, если эти выражения не ссылаются на создаваемый конструктором экземпляр.
Код:
class Outer {
void hello() {
System.out.println("Hello");
}
class Inner {
Inner() {
hello();
super();
}
}
} - Упрощено создание кэша для упреждающей (Ahead-of-Time) загрузки и компоновки классов, позволяющего ускорить запуск HotSpot JVM за счёт задействования классов в уже загруженном и скомпонованном состоянии.
При запуске больше не требуется отдельных операций для записи активности и создания кэша, и достаточно одной команды:Код:
java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ... - При старте HotSpot Java VM реализована возможность использования профилей выполнения методов, полученных при прошлом запуске приложения. Изменение позволяет JIT-компилятору обойтись без стадии накопления статистики и сразу начать генерировать нативный код без ожидания формирования профиля.
- В HotSpot JVM реализована поддержка компактных заголовков объектов, размер которых на 64-разрядных системах уменьшен с 96 до 64 бит (с 12 до 8 байт). Уменьшение размера заголовков позволяет сократить размер кучи и повысить эффективность работы кэша.
- Предложена тестовая реализация API Vector, предоставляющего функции для векторных вычислений, которые выполняются с использованием векторных инструкций процессоров x86_64 и AArch64 и позволяют одновременно применить операции сразу к нескольким значениям (SIMD). В отличие от предоставляемых в JIT-компиляторе HotSpot возможностей по автовекторизации скалярных операций, новый API даёт возможность явно управлять векторизацией для параллельной обработки данных.
- Предложен для тестирования пятый предварительный вариант API для cтруктурированного параллелизма (Structured Concurrency), упрощающего разработку многопоточных приложений за счёт обработки нескольких задач, выполняемых в разных потоках, как единого блока.
- В механизме сопоставления с образцом предложен третий предварительный вариант возможности использования примитивных типов (int, byte, char и другие базовые типы, не являющиеся объектами) во всех видах шаблонов, в операторе "instanceof" и в блоках "switch".
Код:
switch (x.getStatus()) {
case 0 -› "okay";
case 1 -› "warning";
case 2 -› "error";
case int i -› "unknown status: " + i;
}
if (i instanceof byte b) {
... b ...
} - В JDK Flight Recorder (JFR) добавлена экспериментальная поддержка профилирования с более точным отслеживанием потребления ресурсов CPU на платформе Linux. Информация о времени выполнения различных конструкций может быть наглядно визуализирована с использованием цветных диаграмм "FlameGraph".
- В JDK Flight Recorder (JFR) при асинхронном сэмплировании стеков потоков Java повышена стабильность работы за счёт обхода стека вызовов только в "безопасных точках" (safepoints).
- В JDK Flight Recorder (JFR) добавлены средства трассировки и оценки времени выполнения методов.
Поддерживается трассировка стека вызовов конкретных методов и запись точной статистики о вызовах методов, охватывающей такие метрики, как время выполнения и количество вызовов. - Удалён код и сборочные сценарии для поддержки 32-разрядных систем x86. Прекращение поддержки 32-разрядных систем x86 упростило инфраструктуру для сборки и тестирования JDK, а также позволило реализовывать возможности, завязанные на аппаратные платформы, без создания fallback-обработчиков для 32-битных систем x86.
Дополнительно можно отметить публикацию обновления платформы для создания приложений с графическим интерфейсом JavaFX 25 и выпуск универсальной виртуальной машины GraalVM 25, поддерживающей запуск приложений на JavaScript (Node.js), Python, Ruby, R, любых языках для JVM (Java, Scala, Clojure, Kotlin) и языках, для которых может формироваться биткод LLVM (C, C++, Rust).
Источник: https://www.opennet.ru/opennews/art.shtml?num=63895
(opennet.ru, основная лента)