JavaRush /Java Blog /Random-TK /8-den 13-e çenli: Java wersiýalaryna doly syn. 2-nji bölü...

8-den 13-e çenli: Java wersiýalaryna doly syn. 2-nji bölüm

Toparda çap edildi
Bu makala, Java wersiýalarynyň 8-13 wersiýasyndaky täzeliklere synymyň ikinji bölümi. Birinji bölüm şu ýerde . Goşmaça sözlemän, täze JDK çykanda 2018-nji ýylyň 25-nji sentýabryna geçeliň:

Java 11

8-den 13-e çenli: Java wersiýalaryna doly syn.  2-nji bölüm

var (lambda)

Mundan beýläk, lambda parametrleriniň görnüşlerini kesgitläp bileris ýa-da lambda aňlatmasyny (aç-açan ýazylan lambda aňlatmalary) ýazanymyzda goýup bileris:
Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Şeýle hem, üýtgeýän görnüşiň doly adyny ýazmazdan lambda parametrlerine düşündiriş goşup bilersiňiz:
Function<String, String> append = (@NonNull var string) -> string + " Text";

Z (ZGC)

ZGC işlemeýän täze zibil ýygnaýjy. Täze ýady bölýär, ýöne hiç haçan täzeden açmaýar. ZGC ýokary geçirijilik we pes gijä galmak bilen köp mukdarda ýady dolandyrmagy wada berýär (ZGC diňe 64 bitli platformalarda bolýar). Salgy reňklemek - ZGC görkeziji reňklemek usuly bilen 64 bitli görkezijileri ulanýar. Reňkli görkezijiler üýşmekdäki zatlar hakda goşmaça maglumatlary saklaýar. Memoryat böleklere bölünende, GC täze bölünişik üçin ýer tapmaly bolanda, öndürijiligiň peselmeginiň öňüni alýar. ZGC ulanyp, zibil ýygnamak aşakdaky ädimlerden durýar:
  1. dünýä saklanýar: üýşmekdäki obýektlere ýetmek üçin başlangyç nokatlary gözleýäris (ýerli üýtgeýjiler ýa-da statiki meýdanlar ýaly);
  2. kök baglanyşyklaryndan başlap obýekt grafikleriniň kesişmesi. Biz ýeten her bir obýektimizi belleýäris (ZGC obýekt grafigini gezýär we reňkli markerleri barlaýar, bar bolan zatlary belläp geçýär);
  3. gowşak baglanyşyklar ýaly käbir gyradaky ýagdaýlary çözmek;
  4. bölünişini çaltlaşdyrmak üçin üýşmeleňiň uly ýerlerini boşatmak.
  5. hereket etaby başlanda, ZGC üýşmegi sahypalara bölýär we bir gezekde bir sahypa işleýär;
  6. ZGC islendik köküň hereketini tamamlaýar we galan hereketler bolýar.
Bu mowzuk gaty çylşyrymly we bulaşyk. Jikme-jik ara alyp maslahatlaşmak aýratyn bir makala talap eder, şonuň üçinem şu ýerde goýaryn:

Epsilon GC

Epsilon, ýadyň paýlanyşyny dolandyrýan, ýöne hakyky ýady dikeltmek mehanizmini durmuşa geçirmeýän zibil ýygnaýjydyr. Bar bolan Java üýşmesi tükenenden soň, JVM ýapylar. Thisagny, bu zibil ýygnaýjy bilen baglanyşyk bolmazdan, çäksiz massiwde bir zat döredip başlasaňyz, programma OutOfMemoryError bilen ýykylar (we başga biri bilen bolsa, bolmaz, sebäbi obýektleri salgylanmazdan arassalaýar) . Näme üçin zerur? Ine, munuň sebäbi:
  1. Öndürijilik synagy.
  2. Pressureat basyşyny barlamak.
  3. VM interfeýsini barlamak.
  4. Örän gysga iş.
  5. Iň soňky damjanyň gijä galmagy gowulaşýar.
  6. Iň soňky damjanyň geçişi gowulaşdy.
Peýdaly baglanyşyklar: Beýleki täzelikler:
  1. ByteArrayOutputStreamvoid writeBytes(byte [])argumentden başlap ähli baýtlary ýazýan usul aldy OutputStream.
  2. FileReaderwe FileWriterCharset-i görkezmäge mümkinçilik berýän täze konstruktorlar aldy.
  3. Pathiki täze usuly ele aldy, setir argumentinden of(String, String [])gaýdyp gelýär Pathýa-da setirleriň yzygiderliligi, birleşdirilende ýol setirini emele getirýär we of(URI): ýoly URI-den gaýtaryp berýär.
  4. Pattern- berlen giriş setiriniň berlen nagşa laýyk gelýändigini ýa-da ýokdugyny barlaýan usul aldy asMatchPredicate()(adaty aňlatma ulanyp, meselem, akymda maglumatlary süzüp bilersiňiz).
  5. StringKöp peýdaly usullary saýladym, meselem:
    • String strip(): setiriň başynda we soňundaky ähli boşluklar aýrylan (trim (meňzeş), ýöne boşluklary başgaça kesgitleýän) bu setir bolan bir setiri yzyna gaýtaryp berer;
    • String stripLeading(): setirdäki islendik boşluklary aýyryp, bu setir bolan setiri bize gaýtaryp berer;
    • String stripTrailing(): setiriň soňundaky boşluklary aýyryp, bu setir bolan setiri bize gaýtaryp berer;
    • Stream lines(): bizi setirden bölüjiler bilen bölünen, bu setirden alnan Stream;String
    • String repeat(int): bize birnäçe gezek gaýtalanan bu setiriň birleşmesi bolan bir setiri gaýtaryp berer.
    • boolean isBlank(): setir boş bolsa ýa-da diňe boş ýerler bar bolsa, ýalňyş bolar.
  6. Thread- ýok etmek () we saklamak (Zyňylýan) usullar aýryldy.
  7. Filesbirnäçe täze usul aldy:
    • String readString(Path): UTF-8 kodlamagy ulanyp, baýtdan nyşanlara kodlamak bilen bir faýldan ähli maglumatlary bir setire okaýar;
    • String readString(Path, Charset): ýokardaky usuldaky ýaly, baýtdan nyşanlara dekodirlemegiň görkezilen Çyzgydan peýdalanmagy bilen;
    • Path writeString (Path, CharSequence, OpenOption []): Faýla nyşanlaryň yzygiderliligini ýazýar. Nyşanlar UTF-8 kodlamagy ulanyp, baýtlara kodlanýar;
    • Path writeString(Path, CharSequence,Charset, OpenOption []): Aboveokardaky ýaly usul, Çarsetde görkezilen kodlamany ulanyp, diňe simwollar baýtlara kodlanýar.
Bular iň gyzykly API täzelikleri (meniň kiçigöwünli pikirimçe), has jikme-jik gözden geçirmek üçin birnäçe material:

Java 12

Alty aý geçýär we Java-yň ewolýusiýasynyň indiki tapgyryny görýäris. Şeýlelik bilen, bir belgi alyp, gazmagyň wagty geldi. 8-den 13-e çenli: Java wersiýalaryna doly syn.  2-nji bölüm

G1 täzeläň

G1 üçin aşakdaky gowulaşmalar edildi:
  1. Ulanylmadyk bölünen ýady yzyna alyň

    Java üýşmek ýadynda ulanylmaýan ýat (ýa-da başgaça aýdylanda hereketsiz) ýaly bir zat bar. Java 12-de bu meseläni çözmek kararyna geldiler:

    • G1 doly GC-de ýa-da parallel aýlawda üýşmekden ýady yzyna berýär; G1 doly GC-iň öňüni almaga synanyşýar we üýşmek bölünişine esaslanýan parallel aýlawy başlaýar. G1-ni ýadyndan üýşmek üçin mejbur etmeli bolarys.

    Bu gowulaşma, G1 ulanylmaýan wagty ýadyňy awtomatiki usulda OS-a yzyna gaýtarmak bilen öndürijilige gönükdirilýär.

  2. Arakesme wagty geçenden soň garyşyk kolleksiýalary ýatyrmak

    G1 hapa ýygnamak üçin zerur iş mukdaryny saýlamak üçin derňew motoryny ulanýar. Toplumy kesgitläninden we arassalamaga başlandan soň durman janly zatlary ýygnaýar. Bu, zibil ýygnaýjynyň arakesme wagtyndan geçmegine sebäp bolýar. Aslynda bu mesele gowulaşmak arkaly çözülýär, sebäbi indiki ädimi tamamlamak üçin zerur wagt ýeterlik çäklerden çykmasa, bu ädim kesilip bilner.

Mikrobençmark

Java 12, bar bolan görkezijileri ulanyp, JVM öndürijiligini aňsatlyk bilen barlamak üçin mikrobenmarking synaglaryny girizdi. JVM-iň üstünde işlemek isleýänler üçin bu gaty peýdaly bolardy. Goşulan synaglar Java Microbenchmark Harness (JMH) ulanyp döredilýär. Bu synaglar JVM-de üznüksiz öndürijilik synagyny geçirmäge mümkinçilik berýär. JEP 230, Java-yň täze wersiýalary çykanda täze synaglar bilen takmynan 100 synagyň girizilmegini teklip edýär. Ine, goşulýan synaglaryň mysaly .

Şenandoah

Bu pes jogap wagtyny kepillendirmegi maksat edinýän zibil ýygnamak (GC) algoritmidir (aşaky çäk 10-500 ms). Arassalaýyş işleri Java sapaklary bilen bir wagtda ýerine ýetirilende GC arakesmesini azaldar. Şenandoahda arakesme wagty üýşmek ululygyna bagly däldir. Diýmek, arakesme wagty üýşmegiň ululygyna garamazdan birmeňzeş bolar. Bu tejribe aýratynlygy we OpenJDK-nyň standart (Oracle) gurluşyna goşulmaýar.

Geçmegi gowulandyr

Java 12 nagyş gabat gelmek üçin Switch aňlatmalaryny gowulandyrdy. L → täze sintaksis girizildi. Ine, täze wyklýuçateliň esasy nokatlarynyň sanawy :
  1. Täze sintaksis, ýalňyşlyklaryň öňüni almak üçin arakesme zerurlygyny aradan aýyrýar.
  2. Geçiş aňlatmalary indi şowsuz bolmaz.
  3. Mundan başga-da, bir bellikde birnäçe yzygiderliligi kesgitläp bileris.
  4. wyklýuçatel aňlatmalarynda indi adaty ýagdaý talap edilýär.
  5. arakesme, registrden bahalary yzyna gaýtarmak üçin “Switch” aňlatmalarynda ulanylýar (aslynda, wyklýuçatel bahalary yzyna gaýtaryp biler).
Muňa mysal hökmünde seredeliň:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
            break "Please insert a valid day.";
      else
            break "Looks like a Sunday.";
  }
};
Java 13-de aňlatmalary üýtgetmek üçin kesgitli gollanma Beýleki täze aýratynlyklar:
  1. String:

    transform(Function f)- Berlen funksiýany bir setirde ulanýar. Netije setir bolup bilmez.
    indent(int x)- setire x boşluklar goşýar. Parametr otrisatel bolsa, öňdebaryjy boşluklaryň sany (mümkin bolsa) aýrylar.

  2. Filesmismatch()- öz gezeginde iki faýlyň mazmunyndaky ilkinji gabat gelmedik baýtyň ýerini tapyp ýa-da gabat gelmeýän bolsa -1L ýaly usuly ele aldy .

  3. Täze synp peýda boldy -CompactNumberFormat onluk sanlary ykjam görnüşde formatlamak üçin. Bu ykjam görnüşiň mysaly, 1 000 000 ýerine 1M bolup, dokuz simwolyň ýerine diňe iki sanysy gerek.

  4. Iki gymmaty bolan täze hem bar enum- UZAK we GYSGA.NumberFormatStyle

  5. InputStream usuly aldy skipNBytes(long n) : giriş akymyndan n-nji baýt sanyny geçiň.

Gyzykly Java 12 baglanyşygy:

Java 13

Dünýä durmaýar, hereket edýär, ösýär, edil Java - Java 13 ýaly. 8-den 13-e çenli: Java wersiýalaryna doly syn.  2-nji bölüm

Tekst bloky

Setirleri kesgitlemek meselesinde Java hemişe birneme ejir çekdi. Bir çyzyk, boşluk, setir arakesmesi, sitata ýa-da başga bir zat bilen kesgitlemeli bolsak, bu käbir kynçylyklara sebäp boldy, şonuň üçin ýörite nyşanlary ulanmaly bolduk: mysal üçin, setir arakesmesi üçin \ n ýa-da setiriň bir böleginden gaçmak Özi. Bu koduň okalmagyny ep-esli peseldýär we şeýle setir ýazylanda goşmaça wagt alýar. Bu esasanam JSON, XML, HTML we ş.m. görkezýän setirler ýazylanda has göze ilýär. Netijede, kiçijik Json ýazmak islesek, şuňa meňzeş bir zat görüner:
String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Soň bolsa Java 13 sahna çykýar we tekstiň öňünden we soňundan (tekst bloklary diýdiler) üç gezek goşa dyrnak görnüşinde çözgüdini hödürleýär. Geliň, bu täzeligi ulanyp, öňki json mysalyna seredeliň:
String TEXT_BLOCK_JSON = """
{
    "name" : "someName",
    "site" : "https://www.someSite.com/"
}
""";
Has ýönekeý we düşnükli, şeýlemi? StringBu bloklary dolandyrmak üçin degişlilikde üç sany täze usul hem goşuldy:
  • stripIndent(): Setirden tötänleýin boşluklary aýyrýar. Köp setirli setirleri okaýan bolsaňyz we aç-açan beýannama bilen ýüze çykýan (tötänleýin giňişligi aýyrmak üçin düzüjini simulirlemek) birmeňzeş tötänleýin giňişlikden peýdalanmak isleseňiz, bu peýdalydyr;
  • formatted(Object... args ): meňzeş format(String format, Object... arg), ýöne tekst bloklary üçin;
  • translateEscapes(): Degişli icunikod bahasyna terjime edilen gaçmak yzygiderliligi (\ r ýaly) bir setiri görkezýär.

Geçmegi gowulandyr

Switch aňlatmalary Java 12-de girizildi we 13-i arassalaýar. 12-de arakesme ulanyp yzyna gaýtaryş bahalaryny kesgitleýärsiňiz. 13-de girdeji gymmaty hasyl bilen çalşyryldy. Indi Java 12 bölüminde bar bolan wyklýuçatel aňlatmasyny täzeden ýazyp bolar:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
          yield "Please insert a valid day.";
      else
          yield "Looks like a Sunday.";
  }
};
Java bilen eýýäm tanyş bolan programmistleriň arakesmäni kabul etmegi adaty zat bolsa-da, muňa garamazdan gaty geňdi. Maňa aýtjak bolýan arakesme näme? Täze (has täze) hasyl açar söz has düşnüklidir we geljekde gymmatlyklaryň yzyna gaýtarylýan beýleki ýerlerinde peýda bolup biler. Bu mowzuk bilen içgin gyzyklanýanlar üçin şu materiallar bilen tanyşmagyňyzy maslahat berýärin:

Dinamiki CDS arhiwi

CDS - Klassiki maglumatlary paýlaşmak. Köplenç ulanylýan synplaryň toplumyny arhiwde jemlemäge mümkinçilik berýär, soň bolsa birnäçe JVM mysallary bilen ýükläp bolýar. Bu näme üçin bize gerek? Hakykat, sapaklary ýüklemek prosesinde JVM okamak sapaklaryny, içerki gurluşlarda saklamak, okalýan synplaryň dogrulygyny barlamak, garaşly synplary gözlemek we ýüklemek we ş.m. ýaly köp serişde talap edýän hereketleri edýär. we diňe şulardan soň sapaklar işlemäge taýyn. JVM mysallary köplenç şol bir synplary ýükläp bilýänligi sebäpli, köp serişde biderek sarp edilýär. Mysal üçin String, LinckedList, Integer. Dogrusy, ýa-da şol bir programmanyň synplary we bularyň hemmesi çeşmeler. Necessaryhli zerur ädimleri bir gezek ýerine ýetiren bolsak we täzeden işlenip düzülen synplary birnäçe JVM-leriň ýadyna ýükläp boljak arhiwde ýerleşdiren bolsak, bu ýat ýerini ep-esli tygşytlap we amaly başlamagyň wagtyny azaldyp biler. Aslynda CDS diňe şeýle arhiw döretmäge mümkinçilik berýär. Java 9 diňe ulgam sapaklarynyň arhiwine goşulmagyna rugsat berdi. Java 10 - arhiwde amaly sapaklary goşuň. Şeýle arhiwiň döredilmegi aşakdakylardan ybarat:
  • programma tarapyndan ýüklenen synplaryň sanawyny döretmek;
  • tapan sapaklarymyz bilen gaty zerur arhiw döretmek.
Java 13-de täzelik, programma gutaranda arhiw döredip biler ýaly CDS-ni gowulandyrýar. Diýmek, ýokardaky iki ädim indi bir ýere jemlener. Moreene bir möhüm zat: arhiwde diňe programma işleýän wagtynda ýüklenen synplar goşular. Başgaça aýdylanda, programma.jar-da bar, ýöne käbir sebäplere görä ýüklenmedik synplar arhiwde goşulmaz.

Socket API-i täzeläň

Socket API ( java.net.Socket we java.net.ServerSocket ) döredilen gününden bäri Java-nyň aýrylmaz bölegi bolup durýar, ýöne soňky ýigrimi ýylda rozetkalar hiç wagt täzelenmedi. C we Java-da ýazylan, gaty uly we saklamak kyn. Emma Java 13 bu meselä öz düzedişlerini girizmek kararyna geldi we esasy ýerine ýetirişiň ornuny tutdy. Indi “PlainSocketImpl” -iň ýerine prowaýder interfeýsi “NioSocketImpl” bilen çalşyrylýar . Bu täze kodlanan ýerine ýetiriş, java.nio ýaly arka infrastruktura esaslanýar . Aslynda synp sinhronlaşdyrylan usullary däl-de, java.util.concurrent bufer keşini we gulplama mehanizmini ulanýar (segmentlere esaslanýar). Indi dürli platformalara çykmagy aňsatlaşdyrýan ýerli kod talap etmeýär. Şeýle-de bolsa, PlainSocketImpl ulanmaga gaýdyp barmagyň ýoly bar , ýöne mundan beýläk NioSocketImpl ulanylýar .

ZGC üçin ýat gaýdyp gelmek

.Adymyzda bolsa, Z zibil ýygnaýjy, Java arakesmesi hiç haçan 10 ms-den geçmezligi üçin, Java 11-de pes gijeki zibil ýygnamak mehanizmi hökmünde girizildi. Sameöne şol bir wagtyň özünde, Shenandoah we G1 ýaly beýleki wirtual GC HotSpots-dan tapawutlylykda, ulanylmadyk dinamiki ýady OS-a gaýtaryp biler. Bu üýtgetme, bu J ukybyny ZGC-e goşýar. Şoňa görä-de, gowulaşan öndürijilik bilen birlikde ýadyň yzy azalýar we ZGC indi kesgitlenen iň az üýşmek ululygyna ýetýänçä deslapky tertip operasiýa ulgamyna gaýtarylýar. Moreene bir zat: ZGC-de iň köp goldanýan üýşmek ululygy 16 TB. Ozal 4TB çäkdi. Beýleki täzelikler:
  1. javax.securityjdk.sasl.disabledMechanisms- SASL mehanizmlerini öçürmek üçin emläk goşdy .
  2. java.nioFileSystems.newFileSystem (Path, Map <String,?>)- täze faýl döretmek üçin degişlilikde bir usul goşuldy .
  3. Sapaklarda java.nioindi mutlak (degişlilikde tapawutlylykda) getwe setusullar bar. Esasy abstrakt synp ýaly , buferiň bir bölegini almak Bufferusuly bar .slice()
  4. DOM we SAX zawodlaryny çaltlaşdyrmak üçin usullar goşuldy javax.xml.parsers(at giňişligi goldawy bilen).
  5. Icunikod goldawy 12.1 wersiýasyna täzelendi.
Java 13-de gyzykly baglanyşyklar:

Netijeler

Java 14-de yglan edilen täzeliklere geçip bileris, ýöne ýakyn wagtda ýagtylygy görer - JDK 14 2020-nji ýylyň 17-nji martynda çykarylar, iň gowusy, çykandan soň derrew aýratyn, doly gözden geçirmek. . Şeýle hem, Python 2–3 ýaly goýberilişleriň arasynda uzak arakesme bolan beýleki programmirleme dillerinde hiç hili laýyklygyň ýokdugyna ünsi çekmek isleýärin, ýagny kod Python 2-de ýazylan bolsa, ýazarsyňyz 3-e terjime etmek üçin köp işlemeli. Java bu ugurda aýratyn, sebäbi gaty yza gabat gelýär. Bu, Java 5 ýa-da 8 programmaňyzyň Java 8-13 wirtual maşynda işlemeginiň kepillendirilendigini aňladýar, häzirlikçe alada etmegiň zerurlygy ýok. Munuň başga bir ýol bilen işlemeýändigi düşnüklidir: mysal üçin, programmaňyz Java 8 JVM-de ýok bolan Java 13 funksiýasyny ulanýan bolsa. Şu günki güne çenli bar zadym, şu wagta çenli okanlara hormat goýmak)) 8-den 13-e çenli: Java wersiýalaryna doly syn.  2-5-nji bölüm
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION