java12

Java 12 nowości

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/

http://openjdk.java.net/projects/code-tools/jmh/

https://www.infoq.com/articles/java-12-switch-expression

Mateusz Dąbrowski

Cześć jestem Mateusz, zajmuję się programowaniem już ponad 12 lat z czego ponad 8 programuję w Javie. Zapraszam Cię do lektury mojego bloga. Możesz przeczytać więcej o mnie >>TUTAJ<<