Улучшения производительности в JDK 27

alexbik 15 минут назад Краткое содержание статьи Улучшения производительности в JDK 27 Средний 11 мин 217 Блог компании Axiom JDK Java * Программирование * Kotlin * Перевод Автор оригинала: Per-Ake Minborg, Claes...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. alexbik 15 минут назад Краткое содержание статьи Улучшения производительности в JDK 27 Средний 11 мин 217 Блог компании Axiom JDK Java * Программирование * Kotlin * Перевод Автор оригинала: Per-Ake Minborg, Claes Redestad Улучшения производительности в JDK 27В JDK 27 продолжается планомерная работа над производительностью всех компонентов JDK. После выхода JDK 26 в проект OpenJDK внесли более 2300 коммитов, включая изменения в библиотеках, сборщиках мусора, JIT-компиляторе и среде исполнения. Одно из изменений затронет особенно широкий круг приложений: компактные заголовки объектов (Compact Object Headers) теперь включены по умолчанию.
Среди других изменений — использование G1 в качестве сборщика мусора по умолчанию во всех окружениях. Если не указано иное, приведённые ниже числа взяты из JMH-бенчмарков или измерений на рабочих нагрузках, опубликованных в соответствующих пул-реквестах. Они показывают локальный эффект конкретного изменения, а не его влияние на приложение в целом.
Технические детали
На результаты влияют оборудование, характеристики входных данных, размер кучи, сборщик мусора, прогрев и состояние компиляции кода. Улучшения библиотек JDKЛенивые константы: третья предварительная версияJEP 531 представляет третью предварительную версию (preview) ленивых констант — Lazy Constants. Объект LazyConstant вычисляет значение при первом обращении и инициализируется только один раз.
После инициализации он возвращает то же значение — для объекта это означает ту же ссылку, хотя состояние самого объекта может меняться. JVM может использовать это свойство примерно так же, как в случае поля final. Это позволяет применять оптимизации, например свёртку констант, без немедленной инициализации или ручной реализации блокировки с двойной проверкой (double-checked locking).
В JDK 27 удалены низкоуровневые методы isInitialized() и orElse(): их использование могло нарушать задуманную модель инициализации. Кроме того, к существующим фабричным методам создания ленивых списков и отображений добавлен метод Set. Поскольку Lazy Constants остаются preview API, для их использования по-прежнему нужен флаг --enable-preview.
Отраслевые последствия
Ускорение массового копирования в HashMapРаньше HashMap. putAll() и конструктор HashMap(Map) копировали записи через интерфейс Map. При таком подходе создаётся итератор и вызываются методы next(), getKey(), getValue() и hashCode().
Если через одну точку вызова проходят несколько реализаций Map, вызовы могут стать мегаморфными, что затрудняет их оптимизацию JIT-компилятором. Неизменяемая обёртка добавляет ещё один уровень виртуальных вызовов. JDK-8371656 (PR #28243) добавляет специализированные пути выполнения для случаев, когда источником служит именно HashMapлибо немодифицируемая обёртка над ним.
Реализация напрямую обходит внутреннюю таблицу источника и повторно использует хеш, сохранённый в каждом узле. Это позволяет обойтись без итератора и повторного вычисления хеш-кодов. В измерениях на AWS Graviton через точки вызова намеренно пропускали пять типов Map.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.



