Випуск Java SE 25 LTS та OpenJDK 25

Після шести місяців розробки компанія Oracle опублікувала платформу Java SE 25 (Java Platform, Standard Edition 24), як еталонну реалізацію якої використовується відкритий проект OpenJDK. За винятком видалення деяких застарілих можливостей Java SE 25 збережена зворотна сумісність з минулими випусками платформи Java - більшість раніше написаних Java-проектів без змін будуть працездатні при запуску під керуванням нової версії. Готові для встановлення складання Java SE 25 (JDK, JRE та Server JRE) підготовлені для Linux (x86_64, AArch64), Windows (x86_64) та macOS (x86_64, AArch64). Розроблена в рамках проекту OpenJDK еталонна реалізація Java SE 25 повністю відкрита під ліцензією GPLv2 з винятками GNU ClassPath, що дозволяє динамічне зв'язування з комерційними продуктами.

Java SE 25 віднесено до випусків з розширеним терміном підтримки, оновлення для якого будуть випускатися до 2033 (загальнодоступні оновлення виходитимуть до вересня 2030). Як гілки з тривалим терміном підтримки (LTS) також продовжують супроводжуватися гілки Java SE 17 та 21, оновлення для якої будуть випускатися до 2029 та 2031 років, відповідно (загальнодоступні – до 2026 та 2028 років). Розширена підтримка LTS-гілок Java SE 8 та 11 триватиме до 2030 та 2032 років.

Серед запропонованих Java SE 25 нововведень (1, 2, 3, 4):

  • Доданий експериментальний API StableValue для роботи з об'єктами, що містять незмінні дані та оброблювані в JVM як константи. До таких об'єктів застосовуються оптимізації продуктивності, аналогічні полям з ключовим словом «final». API StableValue поділяє створення постійних значень та їх ініціалізацію, гарантує, що значення може бути ініціалізоване лише один раз, скорочує час запуску програм і дозволяє застосовувати в коді користувача оптимізації згортання констант (constant-folding), що раніше використовувалися тільки у внутрішньому коді JDK. class Application { // Було: // static final UserService USERS = new UserService(); // Стало: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
  • Доданий експериментальний API для кодування та декодування об'єктів з криптографічними ключами, сертифікатами та списками відкликаних сертифікатів, використовуючи формат PEM (Pivacy-Enhanced Mail).
  • Додано підтримку обмежених значень (Scoped Values), що дозволяють спільно використовувати незмінні дані в потоках і ефективно обмінюватися даними між дочірніми потоками (значення успадковуються). Scoped Values ​​розвиваються для заміни механізму змінних локальних до потоку (thread-local variables) і більш ефективні при використанні дуже великої кількості віртуальних потоків (тисячі та мільйони потоків). Головна відмінність Scoped Values ​​від змінних локальних до потоку в тому, що перші записуються один раз, надалі не можуть бути змінені і залишаються доступними лише на час виконання потоку.
  • Додано API для використання криптографічних функцій формування ключа (KDF, key derivation function), що дозволяють сформувати додаткові ключі необхідної довжини на основі секретного ключа (наприклад пароля) і довільного набору даних.
  • Видалено код та складальні сценарії для підтримки 32-розрядних систем x86. Припинення підтримки 32-розрядних систем x86 дозволило спростити інфраструктуру для складання та тестування JDK, а також дозволило реалізовувати можливості, зав'язані на платформи, без створення fallback-обробників для 32-бітових систем x86.
  • Додано можливість використання одного виразу «import module M» для імпорту одразу всіх пакетів, що експортуються зазначеним модулем. Зміна значно спрощує повторне використання модульних бібліотек, дозволяючи підключати бібліотеки та класи без визначення їх місця в ієрархії пакетів. Наприклад, вказівка ​​«import module java.base» призведе до імпорту всіх 54 пакетів, що входять у модуль java.base, які раніше потрібно було б згадувати окремо («import java.io.*», «import java.util.*» і т.п.).
  • Запропоновано компактний варіант оформлення програм, який може виявитися корисним для навчання та розробки невеликих додатків. У компактній формі не потрібне визначення зайвих класів, автоматично імпортуються типові API та доступні спрощені методи вводу/виводу. Наприклад, програма «Hello, World!» можна звести до: void main() { IO.println(«Hello, World!»); }
  • Дозволено вказівку в конструкторах виразів перед викликом super(…), що використовується для явного виклику конструктора батьківського класу з конструктора спадкового класу, якщо ці вирази не посилаються на екземпляр, що створюється конструктором. class Outer { void hello() { System.out.println(«Hello»); } class Inner { Inner() { hello(); super(); } } }
  • Додано генеративний режим роботи збирача сміття Shenandoah, при якому окремо обробляються старі та нещодавно створені об'єкти для підвищення ефективності очищення об'єктів з невеликим часом життя. Новий режим забезпечує більш передбачувану пропускну здатність, стійкість до зміни навантаження та зниження споживання пам'яті під час складання сміття. Планувальник Shenandoah має на меті скорочення часу зупинок під час складання сміття за рахунок проведення більшого обсягу робіт паралельно з виконанням Java-додатків.
  • Спрощено створення кешу для запобігання (Ahead-of-Time) завантаження та компонування класів, що дозволяє прискорити запуск HotSpot JVM за рахунок залучення класів у вже завантаженому та скомпонованому стані. При запуску більше не потрібно окремих операцій для запису активності та створення кешу, і достатньо однієї команди: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
  • При старті HotSpot Java VM реалізовано можливість використання профілів виконання методів, отриманих при минулому запуску програми. Зміна дозволяє JIT-компілятор обійтися без накопичення статистики і відразу почати генерувати нативний код без очікування формування профілю.
  • У HotSpot JVM реалізовано підтримку компактних заголовків об'єктів, розмір яких на 64-розрядних системах зменшено з 96 до 64 біт (з 12 до 8 байт). Зменшення розміру заголовків дозволяє скоротити розмір купи та підвищити ефективність роботи кешу.
  • Запропоновано тестову реалізацію API Vector, що надає функції для векторних обчислень, які виконуються з використанням векторних інструкцій процесорів x86_64 та AArch64 і дозволяють одночасно застосувати операції відразу до кількох значень (SIMD). На відміну від можливостей з автовекторизації скалярних операцій, що надаються в JIT-компіляторі HotSpot, новий API дає можливість явно керувати векторизацією для паралельної обробки даних.
  • Запропоновано для тестування п'ятий попередній варіант API для структурованого паралелізму (Structured Concurrency), що спрощує розробку багатопотокових додатків за рахунок обробки декількох завдань, що виконуються в різних потоках, як єдиного блоку.
  • У механізмі зіставлення зі зразком запропоновано третій попередній варіант можливості використання примітивних типів (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 … }
  • У JDK Flight Recorder (JFR) додано експериментальну підтримку профілювання з більш точним відстеженням споживання ресурсів CPU на платформі Linux. Інформація про час виконання різних конструкцій може бути візуалізована з використанням кольорових діаграм «FlameGraph».
  • Підвищена стабільність роботи JDK Flight Recorder (JFR) при асинхронному семплюванні стеків потоків Java за рахунок обходу стека викликів лише безпечних точках (safepoints).
  • У JDK Flight Recorder (JFR) додані засоби трасування та оцінки часу виконання методів. Підтримується трасування стека викликів конкретних методів та запис точної статистики про виклики методів, що охоплює такі метрики, як час виконання та кількість викликів.

Джерело: opennet.ru

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster