Od niedawna jest już dostępna Java 12. Pojawiła się dokładnie 19.03.2019. W związku z tym, że Java 12 nie jest wersją LTS (Long Term Support), tak jak miało to miejsce w przypadku poprzedniej wersji Java 11, nie wnosi zbyt wiele nowości dla developerów.
Poniżej lista zmian, które weszły w nowej wersji Javy:
Wyrażenie switch (Switch Expressions) – preview
Do tej pory switch
był instrukcją warunkową w Javie. Od wersji 12 instrukcji tej możemy także używać jako wyrażenia. Co znaczy, że możemy między innymi przypisać jej wartość do zmiennej.
W starszych wersjach switch
wygląda tak:
switch (month) { case 1: System.out.println("Styczeń"); break; case 2: System.out.println("Luty"); break; case 3: System.out.println("Marzec"); break; }
a w Javie 12:
switch (month) { case 1 -> System.out.println("Styczeń"); case 2 -> System.out.println("Luty"); case 3 -> System.out.println("Marzec"); }
Składniowo przypomina to trochę lambdy.
Nowa konstrukcja switch'a
jest wstępem do wprowadzenia do Javy Pattern Matching (JEP 305). Żeby włączyć działanie nowej konstrukcji switch
trzeba włączyć specjalną flagę --enable-preview
, ponieważ została ona dodana w trybie preview.
Link do JEP 325
Shenandoah: garbage collector charakteryzujący się małymi pauzami podczas odśmiecania pamięci
Jest to eksperymentalny garbage collector. Jego główną zaletą jest zredukowany i bardziej przewidywalny czas opóźnień, powstających podczas sprzątania niepotrzebnych obiektów ze sterty. Działa on na zasadzie równoległego wykonywania odśmiecania pamięci (działa równolegle z wątkami aplikacji).
Link do JEP 189
Microbenchmark Suite – framework do microbenchmarków
Narzędzie bazujące na Java Microbenchmark Harness (JMH) służy do testowania wydajności kodu. Ma pomóc developerom JDK w dodawaniu i utrzymywaniu testów wydajnościowych.
Link do JEP 230
JVM Constants API – api do zarządzania pulą stałych
Dodane zostało api, które umożliwia wygodne ładowanie stałych na poziomie bytecode'u
, niezależnie od klas w których są zawarte. Zmiana ta jest skierowana głównie do autorów bibliotek operujących na bytecode'dzie
.
Link do JEP 334
Abortable Mixed Collections for G1 – anulowanie mieszanych kolekcji w celu przyspieszenia GC
Usprawnienie to polega na poprawieniu wydajności garbage collectora G1, tak by poprzez poprawienie jego wydajności zmniejszyć możliwość przekroczenia zaplanowanego czasu pauzy. Dzięki temu pauzy gc podczas odśmiecania powinny być bardziej dokładne i przewidywalne.
Link do JEP 344
Default CDS Archives – przyspieszenie czasu startu aplikacji
Dodano usprawnienie, które pozwala przyspieszyć czas startu aplikacji nawet o ok. 30%. W Javie 12 podczas budowania JDK jest generowany plik class data-sharing (CDS) archive
, który zawiera domyślną listę klas. Dzięki niemu aplikacje startują dużo szybciej. Funkcjonalność ta dostępna jest także w Javie 11, jednak tam konieczne jest wywołanie specjalnej komendy, która wygeneruje ten plik i przyspieszy kolejne starty (java -Xshare:dump
).
Link do JEP 341
Promptly Return Unused Committed Memory from G1 – optymalizacja zużycia pamięci aplikacji
Jest to usprawnienie, które poszerza możliwości garbage collector’a G1, który może teraz odśmiecać pamieć w czasie gdy aplikacja nic nie robi (w czasie spoczynku). Pomaga to zredukować pamieć, która jest niepotrzebnie alokowana prze aplikację. Jak wiadomo pamięć RAM nie jest taka tania, jakby się mogło wydawać, zwłaszcza w środowisku chmurowym (lub innym zwirtualizowanym), więc zwalnianie jej w stanie spoczynku może mieć pozytywny wpływ na systemy, w których działa aplikacja.
Link JEP 346
One AArch64 Port, Not Two – jedna wersja 64-bitowego portu arm
Poprawka ta usuwa jedną z dwóch 64-bitowych wersji portu arm (czyli arm64). Pozostawiono 32-bitową wersję portu ARM i 64 bitową aarch64. Miało to na celu skupienie się na rozwijaniu tylko jednej wersji portu arm.
Link JEP 340
Podsumowanie
Chociaż w Javie 12 nie pojawiło się zbyt wiele nowości dla developerów, to jednak jest wiele istotnych zmian dla całego świat JVM. Małe ulepszenia często robią wielką różnicę. W końcu wszyscy cieszymy się, kiedy coś zaczyna działać szybciej, zwłaszcza w środowisku lokalnym.
Źródła:
https://openjdk.java.net/projects/jdk/12/