Після шести місяців розробки компанія Oracle опублікувала платформу Java SE 27 (Java Platform, Standard Edition 27), як еталонну реалізацію якої використовується відкритий проект OpenJDK. За винятком видалення деяких застарілих можливостей Java SE 27 збережена зворотна сумісність з минулими випусками платформи Java - більшість раніше написаних Java-проектів без змін будуть працездатні при запуску під керуванням нової версії. Готові для встановлення складання Java SE 27 (JDK, JRE та Server JRE) підготовлені для Linux (x86_64, AArch64), Windows (x86_64) та macOS (x86_64, AArch64). Розроблена в рамках проекту OpenJDK еталонна реалізація Java SE 27 повністю відкрита під ліцензією GPLv2 з винятками GNU ClassPath, що дозволяє динамічне зв'язування з комерційними продуктами.
Java SE 27 віднесено до категорії випусків із звичайним терміном підтримки, оновлення для якого будуть випускатися до наступного випуску. В якості гілки з тривалим терміном підтримки (LTS) слід використовувати Java SE 25, Java SE 21 або Java SE 17, оновлення для яких будуть випускатися до 2033, 2031 і 2029 відповідно (загальнодоступні - до вересня 2030, 2028 і 2026 років). Розширена підтримка LTS-гілки Java SE 8 триватиме до 2030 року, а Java SE 11 – до 2032 року.
Серед змін у Java SE 27 (1, 2, 3, 4):
- За замовчуванням для всіх оточень задіяно збирача сміття G1 (Garbage-First), який раніше застосовувався для серверних систем. G1 оптимізовано для використання на багатопроцесорних системах з великим обсягом пам'яті та балансування між передбачуваністю затримок та високою пропускною здатністю. У процесі роботи G1 поділяє пам'ять на безліч дрібних регіонів і в першу чергу очищає ті регіони, де більше об'єктів, що не використовуються, і менше даних, що активно використовуються.
- У HotSpot JVM за замовчуванням задіяні компактні заголовки об'єктів. Розмір заголовків на 64-розрядних системах зменшено з 96 до 64 біт, що скоротило споживання пам'яті та підвищило ймовірність попадання даних у процесорний кеш. У тестах SPECjbb2015 споживання пам'яті знизилося на 22%, навантаження на CPU зменшилось на 8%, а кількість операцій складання сміття знизилася на 15%. Під час тестування парсера JSON час проходження тестів скоротився на 10%.
- У реалізацію TLS 1.3 додано підтримку гібридних схем узгодження ключів, комбінуючий алгоритм ML-KEM (CRYSTALS-Kyber), стійкий для підбору на квантових комп'ютерах, з класичними алгоритмами на базі еліптичних кривих ECDHE: SecP256r1MLKEM76 (ECDHE з кривою secp256r1 + ML-KEM-768) та SecP384r1MLKEM1024 (ECDHE з кривою secp384r1 + ML-KEM-1024). API javax.net.SSL дані схеми включені за замовчуванням і застосування не вимагають зміни додатків.
- До інструментарію JDK Flight Recorder (JFR), що застосовується для моніторингу, профілювання та діагностики продуктивності, додано підтримку очищення в збереженій діагностичній інформації аргументів командного рядка, початкових значень змінних оточення та системних властивостей. Зміна дозволяє запобігти витоку конфіденційних даних, які обробляє профільований процес, таких як токові авторизації та ключі доступу до API, що передаються через змінні оточення.
- Реалізовано третю попередню редакцію API Lazy Constants для роботи з об'єктами, що містять незмінні дані та оброблювані в JVM як константи. До таких об'єктів застосовуються оптимізації продуктивності, аналогічні полям з ключовим словом «final». На відміну від «final» новий API поділяє створення постійних значень та їх ініціалізацію, гарантує, що значення може бути ініціалізоване лише один раз, скорочує час запуску програм і дозволяє застосовувати в коді користувача оптимізації згортання констант (constant-folding), що раніше використовувалися тільки у внутрішньому. class Application { // Було // static final UserService USERS = new UserService(); // Тепер можна: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- У механізмі зіставлення із зразком запропоновано п'ятий попередній варіант можливості використання примітивних типів (int, byte, char та інші базові типи, що не є об'єктами) у всіх видах шаблонів, в операторі instanceof і в блоках switch. switch (x.getStatus()) { case 0 -> «okay»; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status:" + i; } if (i instanceof byte b) { … b … }
- Запропоновано для тестування сьомий попередній варіант API для структурованого паралелізму (Structured Concurrency), що спрощує розробку багатопотокових додатків за рахунок обробки кількох завдань, що виконуються в різних потоках, як єдиного блоку.
- Реалізовано дванадцяту тестову реалізацію API Vector, що надає функції для векторних обчислень, які виконуються з використанням векторних інструкцій процесорів x86_64 та AArch64 і дозволяють одночасно застосувати операції відразу до кількох значень (SIMD). На відміну від можливостей з автовекторизації скалярних операцій, що надаються в JIT-компіляторі HotSpot, новий API дає можливість явно керувати векторизацією для паралельної обробки даних.
- Доступний третій попередній варіант API для кодування та декодування об'єктів із криптографічними ключами, сертифікатами та списками відкликаних сертифікатів, використовуючи формат PEM (Pivacy-Enhanced Mail).
Додатково можна відзначити публікацію оновлення платформи для створення програм з графічним інтерфейсом JavaFX 27. Найближчим часом також очікується випуск універсальної віртуальної машини GraalVM 27, що підтримує запуск програм на JavaScript (Node.js), Python, Ruby, R, будь-яких мовах для JVM (Java) може формуватися біткод LLVM (C, C++, Rust).
Джерело: opennet.ru
