Что нового в Java 25

Читать первым в Макс

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, нацеленный на упрощение параллельного программирования.

  1. Scoped Values (JEP 506 — финализировано): Легковесная альтернатива ThreadLocal. Они позволяют безопасно передавать неизменяемые данные (например, контекст пользователя) вниз по стеку вызовов и между дочерними потоками. В отличие от ThreadLocal, они автоматически очищаются после выхода из области видимости, предотвращая утечки памяти.
  2. 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): Инструментация байткода для записи точной статистики вызовов методов (количество, минимальное/среднее/максимальное время выполнения).

Безопасность и криптография

  1. KDF API (JEP 510): Новый стандартный API для функций формирования ключа (Key Derivation Functions). Это необходимо для современных протоколов, таких как TLS 1.3, и защиты от атак с использованием квантовых компьютеров.
  2. 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 — это сбалансированный релиз, который одинаково полезен как для упрощения разработки небольших утилит, так и для оптимизации гигантских корпоративных систем за счет новых механизмов управления памятью и потоками.

Поддержать проект

Социальные сети проекта:

Подпишись, чтобы ничего не пропустить!