С выходом Java 25 сообщество разработчиков получило обновленную и улучшенную платформу, которая призвана повысить производительность, упростить работу с многопоточностью и усилить безопасность приложений. Java 25 стала новой версией с долгосрочной поддержкой (LTS), включающей в себя 18 значимых JEP (Java Enhancement Proposals), охватывающих широкий спектр областей – от криптографии и оптимизаций производительности до расширений Java Flight Recorder (JFR) и новых инструментов для анализа работы приложений. Рассмотрим наиболее важные из нововведений, которые будут интересны разработчикам и системным архитекторам. Поддержка PEM-формата для криптографических объектов стала одной из заметных добавок, представленная в версии как превью-функция. Формат PEM широко используется для представления ключей и сертификатов в виде удобочитаемого текста с кодировкой Base64, что упрощает перенос и хранение криптографических данных.
В Java 25 появились классы PEMEncoder и PEMDecoder, позволяющие кодировать и декодировать ключи и сертификаты стандарта PKCS#8. В отличие от предыдущих подходов, теперь можно легко шифровать PEM-файлы с использованием паролей, что значительно расширяет возможности безопасного управления криптографическими материалами. Еще одно новшество — API стабильных значений (Stable Values), которое в превью-режиме предоставляет упрощенный способ ленивой и потокобезопасной инициализации объектов. Часто возникает необходимость отложить создание ресурсоемких объектов для снижения времени запуска приложения или предотвратить ненужную инициализацию. Ранее для подобных задач требовались сложные конструкции с двойной проверкой блокировок (double-checked locking).
Теперь же StableValue API обеспечивает инициализацию «один раз» с минимальными усилиями разработчика, при этом JVM гарантирует безопасность и производительность, благодаря оптимизациям в области постоянного вычисления значений. Новый механизм особенно удобен для создания пулов соединений или любых коллекций с ленивой инициализацией элементов. Удаление поддержки 32-битного x86-порта в JVM является важным шагом для развития платформы. Несмотря на то, что эта архитектура уже практически не используется, её поддержка всё ещё требовала ресурсов команды OpenJDK при разработке новых функций и исправлении ошибок. Вместо этого пользователи 32-битных систем по x86 могут воспользоваться архитектурно-независимой реализацией JVM под названием Zero, которая продолжит поддерживаться.
Это изменение позволит сосредоточить усилия на актуальных и востребованных архитектурах без потери совместимости. Java Flight Recorder (JFR), инструмент мониторинга JVM с минимальной нагрузкой, получил сразу несколько серьезных улучшений. Первым из них стала поддержка профилирования CPU во времени, что позволяет с высокой точностью аннотировать потребление процессорного времени отдельными методами приложения. В Linux для этого используется системный механизм сигналов, позволяющий измерять именно процессорное время исполнения, а не просто общее время выполнения метода. Такой профиль помогает выявлять узкие места в вычислениях, особенно полезен при оптимизации CPU-интенсивных алгоритмов.
Эргономика работы с Ahead-of-Time (AOT) компиляцией значительно улучшилась. В Java 24 была добавлена возможность создания кеша предварительно загруженных и связанных классов, ускоряющего запуск приложений. В Java 25 процесс записи AOT-кеша теперь можно выполнить в одну команду, когда приложение запускается и записывает используемые классы, а кеш будет сформирован при завершении работы. Это упрощает интеграцию AOT в процесс сборки и развёртывания, делая технологию более доступной. Еще одно важное дополнение к AOT-программе — включение профилирования методов непосредственно в кеш.
JIT-компилятор при запуске приложения собирает статистику о том, какие методы наиболее часто вызываются и как их лучше оптимизировать. Добавление этих данных в AOT позволяет сразу использовать эту информацию для более эффективной компиляции и оптимизации, снижая время достижения максимальной производительности. Ранние тесты показывают улучшение старта приложений до 19%. Изменения затронули и сам механизм сбора данных JFR. Теперь сбор стека потоков происходит в безопасных точках (safepoints) JVM, что устраняет искажения данных из-за времени ожидания при остановке потоков и улучшает точность профилирования.
Такое изменение повысит качество мониторинга и диагностики долгоживущих приложений в продакшене. JFR получил возможность методового тайминга и трассировки с помощью байткодовой инструментализации. Раньше для подобных задач использовали инструменты вне JFR, такие как JMH или агенты, что вызывало значительные накладные расходы. В Java 25 появилась встроенная возможность настроить профилирование и трассировку вызовов конкретных методов прямо из параметров запуска JVM. Это новшество делает JFR полнофункциональным инструментом для детального анализа на уровне методов с низкими издержками.
Помимо крупных функций, Java 25 также реализовала значительное количество улучшений и доработок в уже существующих областях. Например, ForkJoinPool теперь реализует интерфейс ScheduledExecutorService, что облегчает задачи планирования и выполнения задач в параллели. Объекты Deflater и Inflater обновлены для поддержки AutoCloseable, позволяя безопасно использовать их в блоках try-with-resources. В API Java добавлены новые методы с утонченным поведением. К примеру, появились методы с точными вычислениями возведения в степень и умножения, которые выбрасывают исключения при переполнении, что способствует написанию более надежного кода.
В классы, работающие с символами и текстом, добавлены удобные методы для чтения и обработки данных, способствующие упрощению задач парсинга и манипуляций с текстом. Со стороны безопасности в состав платформы вошли новые алгоритмы и расширения. Среди них можно выделить поддержку новых функций в области хэширования — алгоритмы SHAKE128-256 и SHAKE256-512, а также современные варианты функций вывода ключей на основе стандарта PKCS#11, включая HKDF-SHA256, HKDF-SHA384 и HKDF-SHA512. Такие изменения делают библиотеку криптографии более современной и соответствующей требованиям безопасности сегодня. Некоторые функции, представленные ранее в виде превью или экспериментальных модулей, теперь стали по умолчанию частью платформы.
Среди них Scoped Values, модуль для импорта всех классов модуля целиком, более гибкие конструкторы и компактный синтаксис источников, значительно упрощающий написание прототипов и небольших утилит. В то же время технологии, связанные с векторными вычислениями (Vector API), структурной конкуренцией и новым паттерн-матчингом для примитивных типов, остаются в стадии активного развития с предварительным статусом. Это говорит о том, что Java 25 уже заложила фундамент для крупных будущих изменений, связанных с высокопроизводительными вычислениями и упрощением многопоточной разработки. Java 25 оказалась релизом, в котором не сделан акцент на громких революционных новинках, но в значительной степени улучшена инфраструктура, инструменты профилирования и удобство работы с API. Особенно полезными станут новые возможности для мониторинга приложений с помощью Java Flight Recorder и стабильные значения для ленивой инициализации.