JDK 16: Nove značajke u Javi 16

Java Development Kit (JDK) 16 dostigao je početnu fazu rampdown-a, što znači da je skup značajki sada zamrznut od 10. prosinca 2020. Nove značajke JDK 16 kreću se od drugog pregleda zapečaćenih klasa do podudaranja uzoraka s istodobnim nitima prerada hrpe za odvoz smeća.

JDK 16 bit će referentna implementacija verzije standardne Jave koja slijedi JDK 15, koja je stigla 15. rujna. Predloženi raspored izdavanja predviđa da JDK 16 u drugu fazu pada 14. siječnja 2021., nakon čega slijede kandidati za izdanje koji dolaze 4. veljače i 18. veljače 2021. Produkcija produkcije trebala bi biti objavljena 16. ožujka 2021.

Sedamnaest prijedloga službeno cilja JDK 16 od 10. prosinca 2020. Nove mogućnosti koje dolaze na Javu 16 uključuju:

  • Prijedlog upozorenja za klase temeljene na vrijednosti označava primitivne klase omota kao temeljene na vrijednosti i odbacuje njihove konstruktore za uklanjanje, što podrazumijeva nova upozorenja o ukidanju. Daju se upozorenja o nepravilnim pokušajima sinkronizacije na primjerima bilo koje klase temeljene na vrijednosti na Java platformi. Pokretač ovog napora je projekt Valhalla, koji teži značajnom poboljšanju Java programskog modela u obliku primitivnih klasa. Primitivne klase proglašavaju instance bez identiteta i sposobne za uvrštene ili izravnane prikaze, gdje se instance mogu slobodno kopirati između memorijskih mjesta i kodirati pomoću vrijednosti polja instanci.Dizajn i implementacija primitivnih klasa u Javi sada su dovoljno zreli da se migracija određenih klasa Java platforme na primitivne klase može očekivati ​​u budućem izdanju. Kandidati za migraciju u API specifikacijama su neformalno označeni kao razredi temeljeni na vrijednosti.
  • Prethodno pregledani u JDK 15, zatvorene klase i sučelja ograničavaju koje ih druge klase i sučelja mogu proširiti ili implementirati. Ciljevi plana uključuju omogućavanje autoru klase ili sučelja da kontrolira kôd odgovoran za njegovu implementaciju, pruža deklarativniji način od modifikatora pristupa da ograniči upotrebu superklase i podržava buduće upute u usklađivanju uzoraka pružajući temelje za analiza uzoraka.
  • Snažna enkapsulacija JDK internih podataka prema zadanim postavkama, osim kritičnih internih API-ja poput misc.Unsafe. Korisnici mogu odabrati opuštenu snažnu inkapsulaciju koja je zadana od JDK 9. Ciljevi ovog prijedloga uključuju poboljšanje sigurnosti i održivosti JDK-a, kao dio Project Jigsaw-a, i poticanje programera da prijeđu s korištenja internih elemenata na korištenje standardnih API-ja, tako da da i programeri i krajnji korisnici mogu lako ažurirati buduća izdanja Java. Ovaj prijedlog nosi primarni rizik da se postojeći Java kôd ne pokrene. Programeri se potiču da koriste jdeps alat za prepoznavanje koda koji ovisi o unutarnjim elementima JDK i prelazak na standardne zamjene kada su dostupni. Programeri mogu koristiti postojeće izdanje, poput JDK 11, za testiranje postojećeg koda pomoću --illegal-access=warnidentificirati unutarnje elemente kojima se pristupa refleksijom, pomoću kojih  --illegal-access=debugse precizno određuje pogrešni kod i testiranje pomoću --illegal-access=deny.
  • API stranog povezivača, koji nudi statički otkucan, čisti Java pristup izvornom kodu. Ovaj će API biti u fazi inkubatora u JDK 16. Zajedno s predloženim API-jem za pristup stranoj memoriji, API inog povezivača znatno će pojednostaviti postupak vezivanja za matičnu knjižnicu sklon pogreškama. Ovim se planom namjerava zamijeniti JNI (Java Native Interface) s superiornim čisto-Java razvojnim modelom, ponuditi C podršku i s vremenom biti dovoljno fleksibilan da prihvati podršku za druge platforme, kao što je 32-bitni x86, i strane funkcije napisane na jezicima koji nisu C, poput C ++. Izvedba bi trebala biti bolja ili usporediva s JNI.
  • Premještanje ZGC (Z Garbage Collector) obrade hrpe niti sa sigurnih točaka u istodobnu fazu. Ciljevi ovog plana uključuju uklanjanje obrade hrpe niti sa ZGC sigurnosnih točaka; čineći obradu hrpe lijenom, kooperativnom, istodobnom i inkrementalnom; uklanjanje svih ostalih obrada korijena po nitima sa ZGC sigurnosnih točaka; i pružanje mehanizma za ostale HotSpot VM podsustave za lijenu obradu stogova. ZGC je namijenjen tome da GC pauze i problemi skalabilnosti u HotSpotu postanu prošlost. Do sada su GC operacije koje se prilagođavaju veličini hrpe i veličini metaprostora premještene iz operacija sigurnih točaka u istodobne faze. To uključuje markiranje, premještanje, referentnu obradu, istovar klase i većinu obrade korijena.Jedine aktivnosti koje se još uvijek rade u GC sigurnim točkama su podskup obrade korijena i vremenski ograničena operacija prekida označavanja. Ovi korijeni uključuju Java stogove niti i ostale korijene niti, s tim što su ovi korijeni problematični jer se prilagođavaju broju niti. Da biste prešli trenutnu situaciju, obrada po niti, uključujući skeniranje stoga, mora se premjestiti u istodobnu fazu. S ovim planom, propusni trošak poboljšane latencije trebao bi biti beznačajan, a vrijeme provedeno unutar ZGC sigurnosnih točaka na tipičnim strojevima trebalo bi biti manje od jedne milisekunde.mora se premjestiti u istodobnu fazu. S ovim planom, propusni trošak poboljšane latencije trebao bi biti beznačajan, a vrijeme provedeno unutar ZGC sigurnosnih točaka na tipičnim strojevima trebalo bi biti manje od jedne milisekunde.mora se premjestiti u istodobnu fazu. S ovim planom, propusni trošak poboljšane latencije trebao bi biti beznačajan, a vrijeme provedeno unutar ZGC sigurnosnih točaka na tipičnim strojevima trebalo bi biti manje od jedne milisekunde.
  • Elastična sposobnost metaprostora, koja OS-u brže vraća memoriju metapodataka (meta-prostora) HotSpot VM, smanjuje trag metaprostora i pojednostavljuje kôd metaprostora kako bi smanjila troškove održavanja. Metaspace je imao problema s velikom upotrebom memorije izvan gomile. Plan zahtijeva zamjenu postojećeg alokatora memorije shemom raspodjele zasnovanom na prijateljima, pružajući algoritam za dijeljenje memorije u particije kako bi se zadovoljili zahtjevi memorije. Ovaj se pristup koristio na mjestima kao što je Linux jezgra i učinit će praktičnim raspodjelu memorije u manjim dijelovima kako bi se smanjili troškovi učitavanja klasa. Fragmentacija će se također smanjiti. Uz to, posvećivanje memorije iz OS-a arenama za upravljanje memorijom vršit će se lijeno, na zahtjev,kako bi se smanjio otisak utovarivača koji započinju s velikim arenama, ali ih ne koriste odmah ili ih možda neće koristiti u punoj mjeri. Da bi se u potpunosti iskoristila elastičnost koju nudi dodjela prijatelja, memorija metaprostora bit će raspoređena u granule jednolike veličine koje se mogu predati i razdvojiti neovisno jedna o drugoj.
  • Omogućavanje jezičnih značajki C ++ 14 kako bi se omogućila upotreba mogućnosti C ++ 14 u izvornom kodu JDK C ++ i pružile konkretne smjernice o tome koje se od ovih značajki mogu koristiti u HotSpot VM kodu. Kroz JDK 15, jezične značajke koje koristi C ++ kôd u JDK ograničene su na jezične standarde C ++ 98/03. S JDK 11 izvorni je kôd ažuriran kako bi podržao izgradnju novijim verzijama C ++ standarda. To uključuje mogućnost izrade s najnovijim verzijama kompajlera koji podržavaju značajke jezika C ++ 11/14. Ovaj prijedlog ne predlaže nikakve promjene stila ili upotrebe za C ++ kôd koji se koristi izvan HotSpot-a. No da bi se iskoristile značajke jezika C ++, potrebne su neke promjene vremena izrade, ovisno o prevoditelju platforme.
  • API vektora u fazi inkubatora, u kojem bi JDK bio opremljen modulom inkubatora, jdk.incubator.vector, za izražavanje vektorskih izračunavanja koja se prevode u optimalne vektorske hardverske upute na podržanim CPU arhitekturama, kako bi se postigle superiorne performanse ekvivalentnim skalarnim proračunima. Vektorski API pruža mehanizam za pisanje složenih vektorskih algoritama u Javi, koristeći već postojeću podršku u HotSpot VM za vektorizaciju, ali s korisničkim modelom koji vektorizaciju čini predvidljivijom i robusnijom. Ciljevi prijedloga uključuju pružanje jasnog i sažetog API-ja za izražavanje niza vektorskih izračuna, agnostički na platformi podržavajući višestruke CPU arhitekture i nudeći pouzdanu izvršnu kompilaciju i performanse na x64 i AArch64 arhitekturama. Cilj je i graciozna degradacija,u kojem bi se vektorsko računanje graciozno degradiralo i dalje funkcioniralo ako se ne može u potpunosti izraziti tijekom izvođenja kao slijed hardverskih vektorskih uputa, bilo zato što arhitektura ne podržava neke upute ili nije podržana druga CPU arhitektura.
  • Prijenos JDK na platformu Windows / AArch64. Izdanjem novog hardvera klase poslužitelja i potrošačkog AArch64 (ARM64), Windows / AArch64 je postao važna platforma zbog potražnje. Iako je samo portiranje već uglavnom završeno, fokus ovog prijedloga uključuje integraciju porta u glavno JDK spremište.
  • Prijenos JDK na Alpine Linux i na druge Linux distribucije koje koriste musl kao svoju primarnu C biblioteku, na x64 i AArch64 arhitekturama. Musl je Linux implementacija standardne funkcionalnosti knjižnice opisane u ISO C i Posix standardima. Alpine Linux je široko prihvaćen u oblakovima, mikroservisima i okruženjima kontejnera zbog svoje male veličine slike. Dockerova slika za Linux manja je od 6 MB. Dopuštanje Java-i da se u takvim postavkama isprazni, omogućit će Tomcat-u, Jetty-ju, Spring-u i drugim popularnim okvirima da rade u tim okruženjima. Korištenjem jlink za smanjenje veličine Java izvršavanja, korisnik može stvoriti još manju sliku prilagođenu izvođenju određene aplikacije.
  • Pružanje klasa zapisa koje djeluju kao transparentni nosači nepromjenjivih podataka. Zapisi se mogu smatrati nominalnim korijenima. Evidencija je pregledana u JDK 14 i JDK 15. Ovaj je napor odgovor na pritužbe da je Java previše opširna ili ima previše ceremonije. Ciljevi plana uključuju osmišljavanje objektno orijentiranog konstrukta koji izražava jednostavno agregiranje vrijednosti, pomažući programerima da se usredotoče na modeliranje nepromjenjivih podataka, a ne na proširivo ponašanje, automatsku primjenu metoda vođenih podacima kao što su equalsi pristupnici te očuvanje dugotrajnih Java principa kao što su nominalni tipkanje.
  • Dodavanje Unix-ovih kanala utičnice, u kojima se podrška za utičnicu Unix-domene (AF_UNIX) dodaje API-jevima kanala utičnice i kanala utičnice poslužitelja u paketu nio.channels. Plan također proširuje naslijeđeni kanalski mehanizam za podršku Unix-domene socket kanala i poslužiteljskih socket kanala. Utičnice Unix domene koriste se za međusobnu komunikaciju na istom hostu. Oni su slični TCP / IP utičnicama u većini aspekata, osim što im se obraćaju nazivima staza datotečnog sustava, a ne IP adresama i brojevima priključaka. Cilj nove mogućnosti je podržati sve značajke utičnih kanala Unix domene koje su uobičajene na glavnim Unix platformama i Windowsima. Socket kanali Unix domene ponašat će se isto kao postojeći TCP / IP kanali u smislu ponašanja čitanja / pisanja, postavljanja veze, prihvaćanja dolaznih veza od strane poslužitelja,i multipleksiranje s drugim neblokirajućim selektivnim kanalima u selektoru. Utičnice Unix domene sigurnije su i učinkovitije od TCP / IP povratnih veza za lokalnu međuprocesnu komunikaciju.
  • API za pristup stranoj memoriji, koji Java programima omogućuje siguran pristup stranoj memoriji izvan Java gomile. Prethodno inkubiran u JDK 14 i JDK 15, API za pristup stranoj memoriji ponovno će se inkubirati u JDK 16, dodajući preciziranja. Napravljene su promjene uključujući jasnije razdvajanje uloga između MemorySegmenti MemoryAddressessučelja. Ciljevi ovog prijedloga uključuju pružanje jedinstvenog API-ja za rad na raznim vrstama strane memorije, uključujući nativnu, postojanu i upravljanu hrpu memorije. API ne bi trebao potkopati sigurnost JVM-a. Motivirajući prijedlog je da mnogi Java programi pristupaju stranoj memoriji, poput Ignite, Memcached i MapDB. Ali Java API ne nudi zadovoljavajuće rješenje za pristup stranoj memoriji.
  • Usklađivanje uzoraka za instanceofoperatora, koje je također pregledano u JDK 14 i JDK 15. Dovršeno bi bilo u JDK 16. Podudaranje uzoraka omogućava zajedničku logiku u programu, odnosno uvjetno izdvajanje komponenata iz objekata, da se izrazi sažetije i sigurno.
  • Pružanje alata jpackage za pakiranje samostalnih Java aplikacija. Predstavljen kao alat za inkubaciju u JDK 14, jpackage je ostao u inkubaciji u JDK 15. S JDK 16, jpackage prelazi u proizvodnju, podržavajući izvorne formate paketa kako bi korisnicima pružio prirodno iskustvo instalacije i omogućio specificiranje parametara pokretanja u vrijeme pakiranja. Formati uključuju msi i exe na Windowsima, pkg i dmg na MacOS-u, te deb i rpm na Linuxu. Alat se može pozvati izravno iz naredbenog retka ili programski. Novi alat za pakiranje rješava situaciju u kojoj mnoge Java programe treba instalirati na izvorne platforme na prvoklasan način, umjesto da se stave na put klase ili put modula. Potreban je instalacijski paket pogodan za matičnu platformu.
  • Migracija spremišta izvornog koda OpenJDK iz Mercuriala u Git. Pokretanje ovog napora prednosti su u veličini metapodataka sustava kontrole verzija i dostupnim alatima i hostingu.
  • Migracija na GitHub, povezana s migracijom Mercurial-to-Git, sa spremištima izvornog koda JDK 16 koja će biti na popularnom web mjestu za dijeljenje koda. Izdanja značajki JDK i izdanja JDK ažuriranja za Javu 11 i novije verzije bit će dio ovog plana. Prijelaz na Git, GitHub i Skara za Mercurial JDK i JDK-sandbox izvršen je 5. rujna i otvoren je za doprinose.  

Izgrade JDK 16 za rani pristup za Linux, Windows i MacOS mogu se naći na jdk.java.net. Poput JDK 15, JDK 16 bit će kratkoročno izdanje, podržano šest mjeseci. JDK 17, koji treba izaći u rujnu 2021., bit će izdanje za dugoročnu potporu (LTS) koje će dobiti nekoliko godina podrške. Aktualno LTS izdanje, JDK 11, objavljeno je u rujnu 2018.