Не LTS-релиз принёс девять JEP'ов, новый сборщик мусора по умолчанию и удаление устаревших параметров, которые могут обрушить production.
Пятнадцатого сентября 2026 года вышла общедоступная версия Java 27. Это не LTS-релиз, так что обновления безопасности и исправления будут выходить всего полгода — до марта 2027-го. Разработчикам, которые сидят на стабильных ветках, стоит это запомнить. В релиз вошло около 2500 закрытых задач и девять JEP'ов — четыре preview-фичи, одна инкубаторная и несколько изменений, которые тихо меняют поведение виртуальной машины.
Главная новость для тех, кто считает каждый мегабайт heap'а: Compact Object Headers теперь включены по умолчанию. Механизм сжимает служебную часть объектов на 64-битных JVM с 96 до 64 бит. На практике это даёт экономию памяти от 10 до 20% в приложениях, которые плодят тысячи мелких объектов — DTO, элементов коллекций, прокси и прочей служебной мишуры. Раньше для этого нужно было вручную прописывать флаг, теперь он просто не нужен. Но не спешите урезать лимиты контейнеров: реальный эффект зависит от структуры конкретного приложения. Перед изменением -Xmx лучше сравнить live set, скорость аллокации и метрики сборщика мусора на настоящей нагрузке.
Java 27 меняет сборщик мусора по умолчанию
Второе крупное изменение касается Garbage-First. Раньше G1 включался автоматически только на серверных машинах, а в окружениях с ограниченными ресурсами JVM могла выбрать Serial GC. Теперь эту лазейку убрали — G1 становится сборщиком по умолчанию везде, независимо от размера машины. Для обычного сервера это пройдёт незаметно. А вот небольшой Spring Boot сервис с лимитом в пару сотен мегабайт и долями ядра после обновления получит другой профиль нагрузки: изменятся накладные расходы, количество потоков и поведение пауз. Если Serial GC использовался намеренно, его теперь придётся указывать явно через –XX:+UseSerialGC.
Java Flight Recorder в Java 27 научился автоматически вычищать чувствительные значения из аргументов JVM, переменных окружения и системных свойств. В стандартный список попали названия вроде password, token, secret, credential, api-key и private-key. Это снижает риск случайно отправить пароль или токен вместе с диагностическим файлом. Свои правила редактуры тоже можно добавить. Но расслабляться не стоит: приложение по-прежнему может записать секрет в пользовательское событие или сообщение об ошибке, так что доступ к JFR-файлам всё равно нужно ограничивать.
Что ещё вошло в Java 27
Девять JEP'ов покрывают не только рантайм, но и язык, и безопасность. JEP 527 добавляет гибридный обмен ключами для TLS 1.3 — защита от будущих атак квантовых компьютеров. Приложения, использующие javax.net.ssl, получают улучшенные алгоритмы по умолчанию, без правок кода. JEP 538 приносит API для кодирования криптографических объектов в формат PEM — третья preview-версия, которая упрощает работу с ключами и сертификатами. JEP 532 продолжает приручать примитивные типы в pattern matching, instanceof и switch — уже пятая preview-итерация, зато компилятор теперь ловит больше ошибок.
JEP 531 отвечает за ленивые константы — третья preview-версия. Механизм даёт гибкость в тайминге инициализации, что особенно полезно для приложений с ИИ и работой с данными. JVM относится к таким константам как к настоящим, обеспечивая ту же производительность, что и при объявлении поля final. JEP 533 — структурная конкурентность, уже седьмая preview. Фича помогает разработчикам писать многопоточный код без боли и упрощает обработку ошибок в параллельных задачах. Всё это вместе делает Java 27 интересной не столько языковыми новинками, сколько изменением поведения виртуальной машины.
Скачать Java 27 и что проверить перед обновлением
Скачать JDK 27 можно в двух вариантах: Oracle JDK под лицензией NFTC и OpenJDK под GPLv2 with Classpath Exception. Полные release notes и список изменений API лежат на официальных ресурсах. Но перед тем как тащить новинку в production, есть три вещи, которые обязательно нужно проверить. Первое — реальное потребление heap с новыми компактными заголовками объектов. Второе — работу G1 в небольших контейнерах. Третье — совместимость скриптов запуска с удалёнными флагами.
А удалили многое. Из Java 27 выкинули устаревшие параметры -noclassgc, -noverify, -verifyremote и -Xverify: none. Если такой флаг остался в старом Dockerfile или конфигурации CI, приложение может просто не запуститься после обновления. Параметр -XX: InitiatingHeapOccupancyPercent переименован в –XX: G1IHOP. Старое имя пока работает, но помечено как устаревшее. Плюс изменился JSON-формат дампов потоков: идентификаторы и счётчики теперь записываются числами, а в корневом объекте появился formatVersion: 2. Внутренние инструменты, которые разбирают такие дампы, придётся проверять отдельно.
Релиз получился техническим и приземлённым. Никаких революций в синтаксисе, зато виртуальная машина стала экономнее и предсказуемее — если, конечно, вы готовы потратить время на проверку метрик и вычистить легаси из скриптов. Java 27 уже доступна, но торопиться с миграцией на неё в бою не стоит. Полгода поддержки — срок короткий, а грабли в контейнерах разложены щедро. Так что тестируем на стенде, сравниваем поведение с Java 25 и только потом двигаемся дальше.