Випуск Java SE 15

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

Java SE 15 віднесено до категорії випусків із звичайним терміном підтримки, оновлення для якого будуть випускатися до наступного випуску. Як гілка з тривалим терміном підтримки (LTS) слід використовувати Java SE 11, оновлення для якого будуть випускатися до 2026 року. Минула LTS-гілка Java 8 підтримуватиметься до грудня 2020 року. Наступний LTS-реліз заплановано на вересень 2021 року. Нагадаємо, що починаючи з випуску Java 10 проект перейшов на новий процес розробки, який передбачає більш короткий цикл формування нових релізів. Нова функціональність тепер розвивається в одній master-гілці, що постійно оновлюється, в яку включаються вже готові зміни і від якої раз на шість місяців відгалужуються гілки для стабілізації нових випусків.

З нововведень Java 15 можна зазначити:

  • Вбудована підтримка алгоритму створення цифрового підпису EdDSA (Edwards-Curve Digital Signature Algorithm) RFC 8032). Запропонована реалізація EdDSA не залежить від апаратних платформ, захищена від атак по сторонніх каналах (забезпечений постійний час усіх обчислень) і за продуктивністю випереджає існуючу реалізацію ECDSA, написану мовою Сі, при тому рівні захисту. Наприклад, EdDSA при використанні еліптичної кривої з 126-бітним ключем демонструє продуктивність аналогічну ECDSA з еліптичної кривої secp256r1 та 128-бітним ключем.
  • Додана експериментальна підтримка запечатаних (sealed) класів та інтерфейсів, які не можуть використовуватися іншими класами та інтерфейсами для успадкування, розширення або перевизначення реалізації. Запечатані класи також надають більш декларативний спосіб обмеження використання суперкласу, ніж модифікатори доступу, що базуються на явному перерахуванні підкласів, дозволених для розширення.

    package com.example.geometry;

    public sealed class Shape
    permits com.example.polar.Circle,
    com.example.quad.Rectangle,
    com.example.quad.simple.Square {…}

  • Додана підтримка прихованих класів, які можуть бути використані безпосередньо байткодом інших класів. Ключовим призначенням прихованих класів є використання у фреймворках, що динамічно генерують класи під час виконання та використовують їх побічно, через відображення. Подібні класи зазвичай мають обмежений життєвий цикл, тому їх підтримка для доступу зі статично згенерованих класів не виправдана і призведе лише до збільшення споживання пам'яті. Приховані класи дозволяють обійтися без нестандартного API sun.misc.Unsafe::defineAnonymousClass, який намічений на видалення в майбутньому.
  • Стабілізований та визнаний готовим для повсюдного використання збирач сміття ZGC (Z Garbage Collector). ZGC працює в пасивному режимі, наскільки це можливо, мінімізує затримки через складання сміття (час зупинки при використанні ZGC не перевищує 10 мс.) і може працювати як з невеликими, так і з величезними купами, розміром від кількох сотень мегабайт до багатьох терабайт.
  • Стабілізовано та визнано готовим для повсюдного використання
    збиральник сміття Шенандоа, що працює з мінімальними призупиненнями (Low-Pause-Time Garbage Collector). Shenandoah розроблений компанією Red Hat і примітний використанням алгоритму, що скорочує час зупинок під час складання сміття за рахунок проведення чищення паралельно з виконанням Java-додатків. Розмір вносяться збирачем сміття затримок передбачуваний і залежить від обсягу купи, тобто. для куп у 200 MB і 200 GB затримки будуть ідентичні (не виходять за межі 50 мс і зазвичай укладаються 10 мс);

  • Стабілізована та введена в мову підтримка текстових блоків — нової форми рядкових літералів, що дозволяють включати у вихідний код багаторядкові текстові дані без застосування екранування символів і зберігаючи вихідне форматування тексту в блоці. Обрамлення блоку здійснюється трьома подвійними лапками.

    Наприклад, замість коду

    String html = « » +
    "\n\t" + " » +
    "\n\t\t" + " "Java 1 is here!" » +
    "\n\t" + " » +
    "\n" + " »;

    можна вказати:

    String html = «»»


    »Java 1 \
    is here!»

    »»»;

  • Перероблено API Legacy DatagramSocket. Старі реалізації java.net.DatagramSocket та java.net.MulticastSocket, замінені на сучасну реалізацію, простішу для налагодження та супроводу, а також сумісну з віртуальними потоками, що розвиваються в рамках проекту Ткацький верстат. У разі можливого порушення сумісності з існуючим кодом стара реалізація не видалена і може бути активована за допомогою опції jdk.net.usePlainDatagramSocketImpl.
  • Запропоновано другу експериментальну реалізацію зіставлення зі зразком в операторі "instanceof", яка дозволяє відразу визначити локальну змінну для звернення до перевіреного значення. Наприклад, можна відразу писати "if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" без явного визначення "String s = (String) obj".

    було:

    if (obj instanceof Group) {
    Group group = (Group) obj;
    var entries = group.getEntries();
    }

    Тепер можна обійтися без визначення "Group group = (Group) obj":

    if (obj instanceof Group group) {
    var entries = group.getEntries();
    }

  • Запропоновано друга експериментальна реалізація ключового слова «запис«, що надає компактну форму визначення класів, що дозволяє обійтися без явного визначення різних низькорівневих методів, як-от equals(), hashCode() і toString(), у разі, коли дані зберігаються лише у полях, поведінка роботи із якими змінюється. Коли в класі використовуються типові реалізації методів equals(), hashCode() і toString(), в ньому можна обійтися без їхнього явного визначення:

    public record BankTransaction(LocalDate date,
    double amount,
    String description) {}

    Це оголошення призведе до автоматичного додавання реалізацій методів equals(), hashCode() і toString() на додаток до конструктора та методів, що контролюють зміну даних (getter).

  • Запропоновано другий попередній варіант API Foreign-Memory Access, що дозволяє Java-додаткам безпечно та ефективно отримати доступ до областей пам'яті, поза купою Java, маніпулюючи новими абстракціями MemorySegment, MemoryAddress та MemoryLayout.
  • Вимкнено та оголошено застарілою техніку оптмізації Biased Locking, що застосовувалася в HotSpot JVM для скорочення накладних витрат через блокування. Ця техніка втратила актуальність на системах з атомарними інструкціями, що надаються сучасними CPU, і надто трудомістка для супроводу через свою складність.
  • оголошено застарілим механізм RMI Activation, який буде вилучено в одному з наступних випусків. Зазначається, що RMI Activation застарів, переведений в розряд опції ще Java 8 і майже не застосовується в сучасній практиці.
  • Вилучений JavaScript-движок Nashorn, який був оголошений застарілим Java SE 11.
  • вилучені порти для ОС Solaris та процесорів SPARC (Solaris/SPARC, Solaris/x64 та Linux/SPARC). Видалення вказаних портів дозволить спільноті прискорити розробку нових можливостей OpenJDK, не витрачаючи час на підтримку особливостей, специфічних для Solaris та SPARC.

Джерело: opennet.ru

Додати коментар або відгук