Выпуск 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

Дадаць каментар