Java JEP dokumenty
Zmeny do jadra jazyka sa implementujú pomocou formálnych dokumentov nazvaných JDK Enhancement-Proposal (JEP). Každý z týchto dokumentov má pridelené svoje identifikačné číslo. Java 10 prináša realizáciu nasledovných JEP dokumentov:
- 286: Local-Variable Type Inference
- 296: Consolidate the JDK Forest into a Single Repository
- 304: Garbage-Collector Interface
- 307: Parallel Full GC for G1
- 310: Application Class-Data Sharing
- 312: Thread-Local Handshakes
- 313: Remove the Native-Header Generation Tool (javah)
- 314: Additional Unicode Language-Tag Extensions
- 316: Heap Allocation on Alternative Memory Devices
- 317: Experimental Java-Based JIT Compiler
- 319: Root Certificates
- 322: Time-Based Release Versioning
JEP 286 – typová inferencia lokálnych premenných
Ide o najzaujímavejšiu novinku pre bežného Java programátora. Zaviedlo sa nové kľúčové slovo var
, ktoré môžeme použiť na ľavej strane priradenia. Java kompilátor si zistí typ premennej z pravej strany priradenia. Tomuto procesu sa hovorí typová inferencia.
$ wget http://download.oracle.com/otn-pub/java/jdk/10+46/76eac37278c24557a3c4199677f19b62/jdk-10_linux-x64_bin.tar.gz $ tar xzvf jdk-10_linux-x64_bin.tar.gz $ mv jdk-10 ~/bin
Stiahneme si Oracle JDK a rozbalíme skomprimovaný archív. Premiestnime inštalačný adresár do nami zvoleného adresára.
$ ~/bin/jdk-10/bin/java --version java 10 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
Overíme si verziu Javy.
$ mkdir -p src/com/zetcode bin $ touch src/com/zetcode/JavaNewsEx.java $ tree . ├── bin └── src └── com └── zetcode └── JavaNewsEx.java $ nano src/com/zetcode/JavaNewsEx.java
Keďže v súčasnosti ešte vývojové prostredia Javu 10 nepodporujú, skompilujeme si ukážkový program ručne. Najprv si vytvoríme adresárovú štruktúru. Otvoríme si súbor v nejakom textovom editore (napríklad nano) a skopírujeme nasledovný zdrojový kód:
package com.zetcode; import java.util.List; public class JavaNewsEx { public static void main(String[] args) { var name = "Jonathan"; System.out.printf("The word %s has %d characters%n", name, name.length()); var age = 34; age += 12; System.out.println(age); var words = List.of("cloud", "fine", "pen", "dog", "temper", "sky", "book"); System.out.println(words); } }
Na ľavej strane priradení používame kľúčové slovo var
. Ide o najväčšiu zmenu v písaní zdrojového kódu Javy.
$ ~/bin/jdk-10/bin/javac -d bin src/com/zetcode/JavaNewsEx.java $ ~/bin/jdk-10/bin/java -cp bin com.zetcode.JavaNewsEx The word Jonathan has 8 characters 46 [cloud, fine, pen, dog, temper, sky, book]
Príklad skompilujeme a spustíme.
JEP 296 – konsolidácia repozitárov
Doteraz bola Java rozdelená do viacerých repozitárov. Kvôli zjednodušeniu vývoja sa všetky repozitáre zjednotia do jediného repozitáru. Pre manažovanie zdrojového kódu Javy sa využíva Mercurial.
JEP 304 – nové rozhranie pre Garbage Collector
Nové rozhranie umožní izoláciu kódu rôznych implementácií GC. Zjednoduší to pridávanie nových GC algoritmov a ich odstránenie z JDK buildov.
JEP 307 – paralelizovaný východzí Garbage Collector
Garbage collection je spôsob automatickej správy pamäte. Uvoľňuje objekty z dynamickej pamäte, ktoré už viac nie sú potrebné. Java 9 zaviedla nový východzí Garbage Collector, nazvaný Garbage-First (G1) collector. Tento nový Garbage Collector sa snaží výhnúť plnému cyklu uvoľňovania pamäte (full GC). Plný cyklus uvoľňovania pamäte zaťažuje procesor a spôsobuje zdržanie, čím sa znižuje responzívnosť aplikácie. Niekedy sa plnému cyklu však nedá vyhnúť; novinka je, že tento plný cyklus bude bežať vo viacerých vláknach, čím sa zlepší jeho výkon.
JEP 310 – zdieľanie aplikačných tried
Od čias Javy 5 sa využíva optimalizačný mechanizmus, ktorý vytvorí zo systémových tried zdielaný archív. Archív je mapovaný v pamäti a je k dispozícii Java aplikáciám. Tento proces sa rozšíri aj o aplikačné triedy. Týmto sa dosiahne rýchlejší štart aplikácií a dôjde k úspore využívania pamäte. Testy ukazujú, že zrýchlenie môže byť až o 30% a úspora v stovkách megabajtov.
JEP 312 – handshakes v lokálnych vláknach
Táto novinka zlepší výkon virtuálnych strojov Javy. Týka sa globálnych safepointov. Globálny safepoint je okamih, keď Java virtuálna mašina zastaví výkonávanie kódu. Anglicky sa tomu hovorí priliehavo „stop the world“. Globálne safepointy sa využívajú pri uvoľnovaní pamäte, JIT kompilácii, alebo debuggovaní. Počas globálneho safepointu sú všetky vlákna pozastavené. Optimalizačná technika, ktorú prináša tento JEP, umožní v niektorých prípadoch vyhnúť sa globálnym safepointom.
JEP 313 – odstránenie javah nástroja
Nástroj javah
vytvára C hlavičkové a zdrojové súbory z Java class súborov, ktoré sú potrebné na vytvorenie natívnych metód (JNI). Táto funkcionalita bola presunutá do Java kompileru ( javac
) v Jave 8, preto sa stal nástroj javah
nadbytočným.
JEP 314 – pridanie nových Unicode tagov
Java lokalizačné a príbuzné API boli rozšírené o nasledovné jazykové tagy:
- cu (currency type)
- fw (first day of week)
- rg (region override)
- tz (time zone)
JEP 316 – alokácia haldy na alternatívnych pamätiach
Tento dokument umožňuje alokovať virtuálnemu stroju haldu na alternatívnych pamäťových zariadeniach, napríklad typu NV-DIMM. To sa môže využívať pri systémoch s hybridnými pamäťami.
JEP 317 – experimentálny Java-JIT kompiler pre Linux
Na platforme Linux/x64 bol pridaný experimentálny Java-JIT kompiler. Ide o snahu otestovať možnosti Java-JIT kompilátorov pre JDK. Just In Time (JIT) kompilácia je optimalizačná technika pre urýchlenie behu programov. Keď sa Java aplikácia spustí, je vybraný Java bytecode preložený priamo do strojového kódu na danej platforme. Toto úsilie je súčasť projektu Metropolis, ktorého cieľom je minimalizovanie C++ kódu pri implementácii behového prostredia Javy. Hovorí sa tomu tiež Java-on-Java.
JEP 319 – koreňové certifikáty
Koreňové certifikáty získali licenciu open-source a sú priamo pridané do JDK buildov. Týmto krokom sa vyšlo v ústrety hlavne vývojárom, ktorý používali OpenJDK.
JEP 322 – nový spôsob tvorby verzií Javy
Reťazec, ktorým sa definuje verzia Javy, sa mení. Po novom reťazec zahŕňa aj dátum, kedy bola nová verzia Javy vydaná. Zohľadňuje sa tiež aj nový šesťmesačný cyklus vydávania verzií Javy. Marcová verzia Javy je JDK 10, septembrová bude JDK 11. Java feature release bude každých šesť mesiacov, update release každý štvrťrok. Počnúc od septembrovej verzie Javy budú mať feature release Javy dlhodobú podporu minimálne tri roky. (Java 9 nebude mať dlhodobú podporu.)
$ ~/bin/jdk-9.0.4/bin/java --version java 9.0.4 Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
V tomto výpise vidíme verziu Javy 9.
$ ~/bin/jdk-10/bin/java --version java 10 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
V tomto výpise vidíme verziu Javy 10.
V článku sme vychádzali z informácií na stránke openjdk.java.net.