Java 12 nadchodzi

Marzec zadomowił się już na całego, a skoro tak to musimy przypomnieć, że jeszcze tylko kilka dni i dokładnie 19 marca światło dzienne ujrzy Java 12 w wersji GA (General Availability). Trzeba przyznać, że szybko to idzie. Jeszcze nie zdążyliśmy się nacieszyć w naszych projektach Javą 11, a już za chwilę będzie się trzeba przełączać na 12. Pytanie tylko czy na pewno trzeba? Na to pytanie postaramy się odpowiedzieć analizując listę zmian i nowości wprowadzonych w najnowszej wersji.

Java 12 - 19 Marca 2019

  • Switch Expressions - Nowe możliwości w tworzeniu kodu z użyciem słowa kluczowego switch. Od tej pory zamiast używać mało czytelnych i zajmujących dużo miejsca bloków, możemy skorzystać ze składni w postaci:
    case  <stała wartość> -> <wyrażenie, blok lub instrukcja throw>
    
    Tak więc zamiast dotychczasowego zapisu w postaci instrukcji możemy osiągnąć ten sam rezultat stosując nowy dużo krótszy zapis (wyrażenie):
    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            System.out.println(6);
            break;
        case TUESDAY:
            System.out.println(7);
            break;
        case THURSDAY:
        case SATURDAY:
            System.out.println(8);
            break;
        case WEDNESDAY:
            System.out.println(9);
            break;
    }
    
    switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
        case TUESDAY                -> System.out.println(7);
        case THURSDAY, SATURDAY     -> System.out.println(8);
        case WEDNESDAY              -> System.out.println(9);
    }
    
    Oprócz tego możemy teraz używać wyrażenia switch, aby uprościć dosyć często spotykany problem ustawiania jednej zmiennej na różne wartości w zależności od stałej. Instrukcja switch występuje wtedy w roli zwykłej metody zwracającej wartość:
    int numLetters;
    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            numLetters = 6;
            break;
        case TUESDAY:
            numLetters = 7;
            break;
        case THURSDAY:
        case SATURDAY:
            numLetters = 8;
            break;
        case WEDNESDAY:
            numLetters = 9;
            break;
        default:
            throw new IllegalSt...
    }
    
    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        case THURSDAY, SATURDAY     -> 8;
        case WEDNESDAY              -> 9;
    };
    
    W przypadku gdy po prawej stronie znaku -> potrzebujemy pełnego bloku (zamiast pojedynczego wyrażenia), możemy skorzystać z rozszerzonej instrukcji break. Umożliwia ona przyjęcie argumentu, który staje się wartością otaczającego wyrażenia switch:
    int j = switch (day) {
        case MONDAY  -> 0;
        case TUESDAY -> 1;
        default      -> {
            int k = day.toString().length();
            int result = f(k);
            break result;
        }
    };
    
    Zmiany dotyczące instrukcji switch są jednym z kroków przygotwujących Javę pod kątem wprowadzenia wsparcia do obsługi dopasowania wzorców Pattern Matching (JEP 305).

    Appa Notka. Na razie nowa wersja switch-a jest funkcjonalnością eksperymentalną i aby z niej skorzystać musimy kompilować nasze źródła z opcją --enable-preview. Jeśli używamy Eclipse'a możemy to ustawić wchodząc do menu Window > Preferences > Java > Compiler. Tam zaznaczamy opcję "Enable preview features".
  • Promptly Return Unused Committed Memory from G1 - Usprawnienie Garbage Collectora G1 w kierunku automatycznego zwracania pamięci z Javy do systemu operacyjnego, gdy pamięć ta jest nieużywana.

    Do tej pory (do Javy w wersji 11) odśmiecacz zwraca pamięć tylko w pełnym cyklu GC lub w cyklu równoczesnym. Takie zachowanie jest szczególnie niekorzystne w środowiskach kontenerowych, w których bardzo często opłaty dokonywane są za zużycie zasobów. Powoduje to, że z jednej strony klienci płacą cały czas, a z drugiej że dostawcy usług w chmurze nie są w stanie w pełni wykorzystać swojego sprzętu.

    Od Javy 12 pamięć jest więc odśmiecana dużo szybciej. Testy z prototypami tego rozwiązania pokazały, że w przypadku środowiska zbudowanego z użyciem Tomcata, takie rozwiązanie może zmniejszyć ilość pamięci zajętej przez maszynę wirtualną Javy o 85%! Wszystko zależy od faktycznego, bieżącego wykorzystania pamięci. Jeśli w ciągu dnia serwer obsłużył wiele żądań, a w nocy był bezczynny to pamięć nie pozostawała zajęta i oszczędność na tym poziomie była jak najbardziej osiągalna.
  • Default CDS Archives - Ulepszenie procesu tworzenia JDK, tak aby już w trakcie kompilacji było generowane archiwum udostępniające dane klas, co przyspieszy czas startu maszyny i to bez użycia dodatkowej konfiguracji (występującej do tej pory pod postacią Xshare:dump).
  • Shenandoah - Nowy algorytm Garbage Collector (GC), który zmniejsza czasy przerwy GC wykonując odśmiecanie równolegle z uruchomionymi wątkami Javy. Działa to podobnie do G1, jednak idzie o krok dalej poprzez wykonanie Concurrent Evacuation, co oznacza kopiowanie obiektów z zestawu kolekcji do innych regionów. Więcej w tym temacie można przeczytać wchodząc na stronę wiki projektu Shenandoah.
  • Microbenchmark Suite - Zestaw narzędzi do testów kodu źródłowego JDK. Bazuje na Java Microbenchmark Harness, które jest rozwiązaniem umożliwiającym uruchamianie i analizowanie testów porównawczych. Microbenchmark Suite upraszcza obsługę istniejących testów oraz tworzenie nowych. Zawiera startowy zbiór około stu testów porównawczych.
  • JVM Constants API - Interfejs API umożliwiający modelowanie opisów kluczowych plików klas i artefaktów używanych podczas uruchamiania programu, w szczególności stałych ładowanych z puli.
  • One AArch64 Port, Not Two - Usunięcie wszystkich źródeł związanych z portem ARM64, przy jednoczesnym zachowaniu 32 bitowego portu ARM i 64 bitowego portu Aarch64. Dzięki temu programiści będą mogli ukierunkować wysiłki w swojej pracy na pojedynczą 64-bitową implementację portu AArch64.
  • Abortable Mixed Collections for G1 - Zmiana w funkcjonowaniu zbiorów mieszanych w w Garbage Collector G1, a dokładniej wprowadzenie przerwania w pracy kolekcji mieszanych jeśli przekroczyły one dostępny czas pauzy.
Lista zmian nie jest może długa, ale za to na pewno godna uwagi. Mamy tutaj do czynienia zarówno z ulepszeniami składni języka (instrukcja switch) jak i z optymalizacją wydajności. Na pewno warto wyróżnić szybsze odśmiecanie pamięci, co często nie pozostaje bez znaczenia w przypadku projektów, w których nie można sobie pozwolić na dodatkowe koszty z tytułu wykorzystywania większych zasobów pamięci RAM. Reasumując, Java 12 wydaje się być warta tego, by zainwestować trochę czasu w przełączenie się na nią w realizowanych projektach.

Autor: Jarek Klimas
Data: 09 marca 2019
Labele:Backend, Poziom podstawowy, Java Linki:
https://openjdk.java.net/projects/jdk/12
https://openjdk.java.net/jeps/305
https://wiki.openjdk.java.net/display/shenandoah/Main
Masz swoje przemyślenia na temat artykułu? Podziel się nimi!
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE