Po šestih mesecih razvoja je podjetje Oracle izdalo platformo Java SE 16 (Java Platform, Standard Edition 16), pri čemer se kot referenčna izvedba uporablja odprti projekt OpenJDK. V Java SE 16 je ohranjena združljivost z prejšnjimi različicami platforme Java, vsi prej napisani projekti Java bodo delovali brez sprememb, ko bodo zagnani na novi različici. Pripravljene za namestitev zbirke Java SE 16 (JDK, JRE in Server JRE) so na voljo za Linux (x86_64, AArch64), Windows in macOS. Referenčna izvedba Java 16, razvita v okviru projekta OpenJDK, je v celoti odprta pod licenco GPLv2 z izjemami GNU ClassPath, ki dovoljujejo dinamično povezovanje s komercialnimi izdelki.
Java SE 16 spada v kategorijo izdaj s standardnim obdobjem podpore, posodobitve za katero bodo izhajale do naslednje izdaje. Za dolgoročno podporo (LTS) je priporočljivo uporabljati Java SE 11, posodobitve za katero bodo izhajale do leta 2026. Naslednja LTS-izdaja je predvidena za september 2021. Spomnimo, da je z izdajo Java 10 projekt prešel na nov postopek razvoja, ki vključuje krajše cikle za nove izdaje. Nova funkcionalnost se zdaj razvija v eni stalno posodobljeni glavni veji, v katero se vključujejo že pripravljene spremembe in od katere se enkrat na šest mesecev odcepijo veje za stabilizacijo novih izdaj.
Pri pripravi nove izdaje je bila razvojna ekipa prenesena z sistema za upravljanje različic Mercurial na Git in platformo za sodelovanje GitHub. Pričakuje se, da bo migracija povečala zmogljivost operacij z repozitorijem, izboljšala učinkovitost shranjevanja, omogočila dostop do sprememb v celotni zgodovini projekta, izboljšala podporo za pregledovanje kode in uporabila API za avtomatizacijo delovnih tokov. Poleg tega uporaba Gita in GitHub-a naredi projekt bolj privlačen za novince in razvijalce, ki so navajeni na Git.
Med novostmi Java 16 lahko izpostavimo:
- Dodana je eksperimentalna komponenta jdk.incubator.vector s implementacijom API-ja Vector, koji pruža funkcije za vektorske proračune, koje se izvršavaju korištenjem vektorskih instrukcija procesora x86_64 i AArch64 i omogućavaju istovremeno primjenjivanje operacija na nekoliko vrijednosti (SIMD). Za razliku od mogućnosti automatske vektorizacije skalarnih operacija koje nudi JIT-kompajler HotSpot, novi API omogućava eksplicitno upravljanje vektorizacijom za paralelnu obradu podataka.
- U JDK i VM HotSpot kodu, napisanom u C++, dozvoljeno je korištenje funkcionalnosti koje su se pojavile u specifikaciji C++14. Ranije je bilo dozvoljeno korištenje standarda C++98/03.
- U prikupljaču smeća ZGC (Z Garbage Collector), koji radi u pasivnom režimu i nastoji minimalizirati kašnjenja uzrokovana prikupljanjem smeća, dodana je mogućnost paralelne obrade stekova niti bez prekidanja izvršavanja niti aplikacije. U ZGC-u su sada ostale samo operacije koje zahtevaju pauzu, koje uzrokuju trajna kašnjenja obično ne duža od nekoliko stotina mikrosekundi.
- U klasama SocketChannel, ServerSocketChannel i java.nio.channels dodana je podrška za Unix-sokete (AF_UNIX).
- Implementirana je verzija za Linux distribuciju Alpine sa standardnom C bibliotekom musl, koja je popularna u okruženjima za kontejnere, mikroservise, oblačne i ugrađene sisteme. Predložena verzija u ovim okruženjima omogućava izvođenje Java programa kao običnih aplikacija. Pored toga, pomoću jlink-a moguće je ukloniti sve neiskorištene module i formirati minimalno okruženje, dovoljno za izvođenje aplikacije, što omogućava stvaranje kompaktnim slikama specifičnim za određene aplikacije.
- Implementiran je mehanizam Elastic Metaspace, koji optimizira operacije alokacije i vraćanja memorije zauzete metapodacima klasa (metaspace) u JVM HotSpot. Primjena Elastic Metaspace smanjuje fragmentaciju memorije, smanjuje preklapanje troškova u učitavaču klasa, a također povoljno utiče na performanse dugotrajnih serverskih aplikacija bržim vraćanjem sistema operativnoj memoriji, koja je zauzeta neiskorištenim metapodacima klasa. Za odabir načina oslobađanja memorije nakon uklanjanja klasa predložena je opcija „-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)“.
- Добавljen je JDK port za Windows sisteme koji rade na hardveru sa AArch64 arhitekturom.
- Predložen je treći preliminarni API Foreign-Memory Access, koji omogućava Java aplikacijama da bezbedno i efikasno pristupaju oblastima memorije van Java heap-a, manipulišući novim apstrakcijama MemorySegment, MemoryAddress i MemoryLayout.
- Realizovan je eksperimentalni API Foreign Linker, koji omogućava pristup nativnom kodu iz Jave. Zajedno sa API-em Foreign-Memory, novi softverski interfejs značajno pojednostavljuje kreiranje omota oko običnih deljenih biblioteka.
- Dodati su alati jpackage koji omogućava kreiranje paketa za samostalne (self-contained) Java aplikacije. Ovaj alat se bazira na javapackager-u iz JavaFX-a i omogućava formiranje paketa u formatima koji su specifični za različite platforme (msi i exe za Windows, pkg i dmg za macOS, deb i rpm za Linux). Paketi uključuju sve potrebne zavisnosti.
- Podrazumevano je uključena stroga inkapsulacija svih unutrašnjih elemenata JDK-a, osim kritičnih API-ja kao što je sun.misc.Unsafe. Vrednost opcije „—illegal-access“ je sada po defaultu postavljena na „deny“ umesto „permit“, što će blokirati pokušaje pristupa većini unutrašnjih klasa, metoda i polja iz koda. Da bi se zaobišlo ovo ograničenje, koristi se opcija „—illegal-access=permit“.
- Stabilizovana je realizacija meča tipa u operatoru „instanceof“, koja omogućava trenutnu definiciju lokalne promenljive za pristup validiranoj vrednosti. Na primer, sada može odmah pisati „if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}“ bez eksplicitnog definisanja „String s = (String) obj“. Bilo je: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Sada može bez definisanja „Group group = (Group) obj“: if (obj instanceof Group group) { var entries = group.getEntries(); }
- Stabilizovana je realizacija ključne reči „record“, koja pruža kompaktnu formu za definisanje klasa, omogućavajući izbegavanje eksplicitnog definisanja različitih niskonivo metodâ kao što su equals(), hashCode() i toString() u slučajevima kada se podaci čuvaju samo u poljima, čije ponašanje ostaje nepromenjeno. Kada se u klasi koriste tipične implementacije metoda equals(), hashCode() i toString(), u njoj se može obići bez njihovog eksplicitnog definisanja: public record BankTransaction(LocalDate date, double amount, String description) {}
Ta oglas bo avtomatsko dodal implementacije metod equals(), hashCode() in toString() poleg konstruktorja in metod, ki nadzorujejo spremembo podatkov (getter).
- Predlagana je druga predhodna različica zaprtih ('sealed') razredov in vmesnikov, ki jih drugi razredi in vmesniki ne morejo uporabljati za dedovanje, razširitev ali prepisovanje implementacije. Zaprti razredi nudijo tudi bolj deklarativen način omejevanja uporabe nadrazreda kot modifikatorji dostopa, osnovan na izrecnem naštevanju podrazredov, ki so dovoljeni za razširitev. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
Izvor: opennet.ru
