16 сентября 2025 года состоялся релиз Java 25. Это версия с долгосрочной поддержкой (LTS — Long-Term Support), обновления для которой будут выходить как минимум до 2030 года, а расширенная поддержка продлится до 2034 года.
В этот релиз вошли 18 основных изменений (JEP), которые делают язык проще для новичков, эффективнее для высоконагруженных систем и удобнее в повседневной разработке.
Компактный код и упрощённая точка входа (JEP 512 и 511)
Одним из самых заметных изменений стало введение компактных исходных файлов и экземплярных main-методов (не статичных).
- Как это работает: Теперь для простой программы не нужно писать громоздкую конструкцию
public static void main(String[] args)и оборачивать всё вclass. - Новый ввод/вывод: Добавлен класс
java.lang.IO, позволяющий писатьIO.println("Привет!")вместо длинногоSystem.out.println. - Импорт модулей: С помощью
import module java.base;можно одной строкой импортировать все 54 пакета стандартной библиотеки.
Пример минимальной программы в Java 25:
void main() {
String name = IO.readln("Как вас зовут? ");
IO.println("Привет, " + name);
}
Этот код можно запустить напрямую как скрипт.
Гибкие тела конструкторов (JEP 513)
Эта фича наконец-то вышла из режима предварительного просмотра и стала официальной частью языка.
- Суть: Раньше вызов
super()илиthis()обязан был быть первой строкой в конструкторе. Теперь разрешено выполнять код до вызова конструктора суперкласса. - Польза: Это позволяет проводить валидацию аргументов или инициализировать поля текущего класса до того, как начнёт работать логика родительского класса.
Пример:
public class Employee extends Person {
public Employee(int age) {
if (age < 18) throw new IllegalArgumentException(); // Валидация до super()
super(age);
}
}
Улучшенная многопоточность: Scoped Values и Structured Concurrency
Java 25 продолжает развивать проект Loom, нацеленный на упрощение параллельного программирования.
- Scoped Values (JEP 506 — финализировано): Легковесная альтернатива
ThreadLocal. Они позволяют безопасно передавать неизменяемые данные (например, контекст пользователя) вниз по стеку вызовов и между дочерними потоками. В отличие отThreadLocal, они автоматически очищаются после выхода из области видимости, предотвращая утечки памяти. - Structured Concurrency (JEP 505 — 5-е превью): Механизм, который объединяет группу связанных задач (выполняемых в виртуальных потоках) в единый блок. Если одна задача падает, остальные автоматически отменяются, что делает код надежнее.
Пример (безопасная передача контекста и параллельные задачи):
private static final ScopedValue<String> USER_ID = ScopedValue.newInstance();
void handleRequest(String user) {
// Привязываем USER_ID только для этого блока
ScopedValue.where(USER_ID, user).run(() -> {
try (var scope = StructuredTaskScope.open()) { // Открываем область задач
var task1 = scope.fork(() -> findUser());
var task2 = scope.fork(() -> fetchOrder());
scope.join(); // Ждем завершения группы
IO.println("Пользователь: " + USER_ID.get()); // Доступ к значению
} catch (Exception e) { /* Обработка */ }
});
}
Производительность: компактные заголовки и новый GC
Для высоконагруженных систем Java 25 предлагает два ключевых улучшения рантайма:
- Компактные заголовки объектов (JEP 519): Раньше заголовок каждого объекта в памяти занимал 96 или 128 бит. Теперь его размер уменьшен до 64 бит. В тестах это позволило снизить потребление памяти кучи (heap) на 22% и ускорить работу приложений на 10%.
- Generational Shenandoah (JEP 521): Сборщик мусора Shenandoah теперь поддерживает разделение объектов на поколения (молодые и старые). Это повышает его эффективность, сохраняя главную фишку — сверхкороткие паузы при сборке мусора, не зависящие от размера памяти.
Профилирование и диагностика (JFR)
Инструмент JFR (JDK Flight Recorder), предназначенный для сбора данных о работе приложения с минимальными накладными расходами, получил мощные обновления:
- CPU-Time Profiling (JEP 509): Позволяет на Linux точнее отслеживать, сколько ресурсов процессора потребляют конкретные методы, включая нативный код.
- Method Timing & Tracing (JEP 520): Инструментация байткода для записи точной статистики вызовов методов (количество, минимальное/среднее/максимальное время выполнения).
Безопасность и криптография
- KDF API (JEP 510): Новый стандартный API для функций формирования ключа (Key Derivation Functions). Это необходимо для современных протоколов, таких как TLS 1.3, и защиты от атак с использованием квантовых компьютеров.
- PEM Encodings (JEP 470): Появился встроенный инструмент для работы с форматом PEM (текстовый формат для ключей и сертификатов). Теперь не нужно использовать сторонние библиотеки или вручную парсить Base64, чтобы прочитать файл
.pem.
Что удалили?
В Java 25 полностью удален код и поддержка сборки для 32-битных x86-систем (JEP 503). Разработчики OpenJDK посчитали, что поддержка устаревшей архитектуры тормозит внедрение новых функций, таких как виртуальные потоки и Vector API.
Как попробовать новые фичи?
Некоторые возможности (например, Stable Values — механизм «отложенной неизменяемости» для ускорения старта) всё еще находятся в статусе Preview или Experimental.
Чтобы использовать их, необходимо добавить флаги при компиляции и запуске:
javac --release 25 --enable-preview Main.java
java --enable-preview Main
Заключение: Java 25 LTS — это сбалансированный релиз, который одинаково полезен как для упрощения разработки небольших утилит, так и для оптимизации гигантских корпоративных систем за счет новых механизмов управления памятью и потоками.