Для будущего JDK 28 подготовили оптимизацию FFM API: небольшие выделения нативной памяти в Arena.ofConfined() смогут обслуживаться из переиспользуемых пулов. По умолчанию кэш платформенного потока хранит до четырёх пулов по 64 байта.
Пул выдают арене при подходящей аллокации. При закрытии использованную память обнуляют; пул возвращают в кэш либо освобождают, если кэш полон. Сегменты закрытой арены остаются недоступными. Крупные запросы и неподходящее выравнивание используют обычный путь выделения памяти.
Оптимизация работает и с виртуальными потоками: пул берётся у несущего потока и затем принадлежит арене. Переписывать вызовы API не требуется. Выигрыш в JMH измерен для маленьких аллокаций; ускорение всего приложения зависит от его нагрузки.
Для JDK 28 интегрировали JEP 540: модуль jdk.incubator.json позволит работать с JSON без внешней библиотеки. Метод Json.parse() строит дерево JsonValue, по которому можно переходить через get() и извлекать значения нужного типа.
Такой API пригодится, например, для разбора ответа REST-сервиса или создания небольшого JSON-документа в утилите. Область задач ограничена: автоматического преобразования Java-объектов в JSON и потокового разбора в нём нет.
API находится в стадии инкубации, а JDK 28 доступен в ранних сборках. Для существующего приложения на Jackson переход потребует оценки того, какие возможности оно использует.
1. При построении дерева зависимостей Maven обнаруживает core:1.4 через client: от приложения до этой зависимости два перехода.
2. Через adapter и bridge обнаруживается core:2.0: до неё три перехода.
3. Поскольку groupId и artifactId совпадают, Maven рассматривает эти зависимости как две версии одного артефакта и разрешает конфликт по правилу ближайшей зависимости.
4. Путь до core:1.4 короче, поэтому в путь классов попадает только версия 1.4. Более высокий номер версии не даёт приоритета, а сам конфликт версий обычно не прерывает сборку.
Почему это важно
Задача проверяет разрешение транзитивных зависимостей Maven. При добавлении библиотеки приложение может получить более старую версию общего артефакта, чем ожидает другой компонент. Если ему нужны методы из версии 2.0, во время выполнения возможен NoSuchMethodError. Дерево зависимостей помогает обнаружить такой выбор, а управление версиями — задать согласованную версию явно.
Почему нагрузочный тест в одной JVM может скрыть задержки GC
Если генератор запросов работает в той же JVM, что и тестируемый сервис, пауза GC останавливает оба компонента. Пока сервис не отвечает, генератор тоже не создаёт часть запросов. В измерения не попадает нагрузка, которая пришла бы от независимого клиента.
Исследователи сравнили режимы SPECjbb2015 на OpenJDK 27: с генератором внутри JVM сервиса и в отдельном процессе. Для сборщиков с заметными паузами значения p99 существенно различались; у ZGC такой разницы не наблюдали.
Даже учёт запланированного времени отправки не восстанавливает запросы, которые генератор не смог создать. При проверке хвоста задержек полезно вынести его в отдельную JVM и сопоставить времена запросов с логами GC.
JNI отдаёт нативному коду дескриптор Java-объекта. Локальная ссылка, созданная в native-методе, привязана к текущему потоку и освобождается при завершении вызова. Сохранить её в статической переменной для следующего вызова — значит оставить недействительный дескриптор.
Для кэширования класса или callback-объекта нужна NewGlobalRef(). Такая ссылка удерживает объект от сборки мусора, пока нативный код не вызовет DeleteGlobalRef(). Поэтому место освобождения стоит определить сразу.
Отдельная ошибка — передавать JNIEnv* другому потоку. Нативный поток должен получить собственное окружение через подключение к JVM. Для диагностики в HotSpot есть флаг -Xcheck:jni.
Spring переводит патч-релизы на единый Patch Thursday
Регулярные патч-релизы проектов Spring теперь будут собирать в один день. Раньше релизы распределялись по двухнедельному окну: исправления в разных частях экосистемы появлялись постепенно.
Новое окно — четверг после третьего понедельника месяца. Первый регулярный выпуск по этой схеме намечен на 22 октября 2026 года. Команда сохраняет привычный день публикации Spring Boot в Maven Central.
Для сопровождения сервисов это повод пересмотреть календарь обновлений и интеграционных проверок зависимостей. Одновременно Spring обновил раздел security: рекомендации по уязвимостям можно искать по CVE, важности и проекту.