Как измерить экономию памяти от компактных заголовков в Java 27
В Java 27 HotSpot по умолчанию сокращает заголовок объекта с 12 до 8 байт. Но из-за выравнивания по 8 байт объект с одним полем int остался 16-байтным, а с двумя уменьшился с 24 до 16 байт.
Воспроизводимый эксперимент сравнивает две JVM с одинаковыми настройками кучи и G1. Java-агент вызывает getObjectSize() и измеряет только сам объект, без объектов по ссылкам. Во втором запуске компактные заголовки отключаются флагом -XX:-UseCompactObjectHeaders.
Перед уменьшением лимита кучи стоит проверить формы объектов, которые преобладают в сервисе, а затем сравнить живую кучу, нагрузку на GC, задержки и память процесса. Сокращение заголовка само по себе ещё не доказывает экономию ресурсов приложения.
Spring Boot 4 и BoxLang: как сохранить CFML-шаблоны при миграции
BoxLang Spring Boot Starter позволяет оставить представления на CFML, языке шаблонов ColdFusion, пока контроллеры и другие части приложения переносятся на Spring. В Maven-проект добавляется стартер версии 1.0.0, а свойство boxlang.suffix=.cfm переключает его обработчик представлений с файлов .bxm на .cfm.
Контроллер остаётся обычным для Spring MVC: возвращает логическое имя представления, а атрибуты Model автоматически становятся переменными CFML. В шаблонах продолжают работать cfoutput, условия, циклы и подключение общих блоков.
Это даёт путь для поэтапной миграции без одновременной переписи всех представлений. В готовом примере показаны настройка проекта, передача данных из контроллера и запуск шаблонов на Spring Boot 4.
JDK 25 и G1: почему Arrays.fill замедлился в 265 раз
В JMH-тесте на Apple M4 Max заполнение массивов ссылок заняло у G1 139 мс, а у ParallelGC 0,5 мс. При этом сборка мусора не запускалась: почти всё время ушло в JIT-код Arrays.fill.
Причина: барьер записи, который JVM добавляет к каждому присваиванию ссылки. Он помечает изменённые участки кучи, чтобы G1 не сканировал всё старое поколение. На результат также повлияли размер регионов G1 и переход массива в старое поколение.
Разбор JMH-бенчмарка и ARM64-инструкций HotSpot объясняет, почему одной инструкции оказалось недостаточно. Замедление относится к этой конфигурации: перед настройкой G1 повторите замер на своей нагрузке.
Как настроить MFA в Spring Security 7 для приложения и отдельных эндпоинтов
Spring Security 7, доступный со Spring Boot 4, добавил FactorGrantedAuthority. После входа по паролю пользователь получает FACTOR_PASSWORD, а после одноразового токена из письма — FACTOR_OTT. Доступ открывается, когда собраны все обязательные факторы.
Для MFA во всём приложении аннотация @EnableMultiFactorAuthentication связывает фильтры входа и создаёт проверку требуемых факторов. Стандартная форма не умеет задавать их порядок, поэтому для последовательного сценария понадобятся собственные страницы.
Чтобы усилить только /admin/**, аннотации передают пустой список факторов, а отдельный AuthorizationManagerFactory назначают этому маршруту. Остальные запросы сохраняют однофакторную проверку. Конфигурация обоих вариантов приведена с кодом.
Как StructuredTaskScope в JDK 27 отменяет лишнюю работу при сбое
Два независимых вызова к сервисам последовательно занимают около двух секунд. Виртуальные потоки с Future сокращают успешный запуск примерно до секунды, но при сбое одного вызова через 200 мс второй продолжает работу. Закрытие ExecutorService ждёт его завершения, хотя результат уже не нужен.
StructuredTaskScope объединяет подзадачи: ошибка одной прерывает соседнюю, а join() сообщает о сбое всей группы. В примере метод возвращается примерно через 200 мс вместо полной секунды.
Сравнение трёх реализаций учитывает седьмую предварительную версию API в JDK 27 и проверяемое исключение ExecutionException. Для запуска нужен --enable-preview. Ограничение сохраняется: задача должна реагировать на прерывание, а закрытие области ждёт завершения всех подзадач.
Как подтвердить взаимную блокировку по дампу потоков Java
Если JVM перестала выполнять работу, снимите несколько дампов с интервалом в несколько секунд: jcmd <pid> Thread.print -l или jstack -l <pid>.
Найдите потоки в состоянии BLOCKED. Сопоставьте монитор после waiting to lock с потоком, который держит его после locked. Если цепочка вернулась к первому потоку, взаимная блокировка подтверждена.
WAITING и TIMED_WAITING сами по себе нормальны. Практический разбор дампов показывает, как сверить стеки с метриками. Исправлять нужно порядок захвата блокировок: увеличение пула цикл не разорвёт.
Spring Boot 4: настраиваем экспорт логов, метрик и трассировок через OpenTelemetry
В Spring Boot 4 появился собственный OpenTelemetry starter. Spring рекомендует его вместо Java-агента и стороннего starter с альфа-зависимостями.
Для логов нужны Logback appender, logback-spring.xml и вызов install(). В 4.0.0 экспорт без Actuator не работал, обе ошибки исправили в 4.0.1.
Метрики потребуют Micrometer и дополнительных bean-компонентов, для трассировок достаточно адреса экспорта. Полная схема настройки включает Docker Compose с Grafana LGTM. Проверьте адрес логов: нужен /v1/logs, не /v1/traces.