W tym tekście przybliżę Wam jakich zmian dokonało Oracle w JDK 9 oraz w Java 9 API. Jeśli jesteś developerem na pewno zainteresuje Cię to, jakie nowości wprowadza nowe wydanie platofrmy od Oracle. Zapraszam do lektury.
Trochę o Javie i JVM
Java i JVM to dwie, całkiem różne od siebie rzeczy. Java to język, w którym programujemy, a JVM to zespół oprogramowania będącego maszyną wirtualną, czyli swoistą warstwą pośredniczącą między nami, a tzw. “bare hardware”. To dzięki takiej strukturze programista JVM(nie, nie Javy) może w ogóle nie przejmować się sprawami czysto sprzętowymi takimi jak alokacja zmiennych w pamięci RAM, pilnowanie zwalniania jej, pilnowanie zużycia CPU czy GPU czy inne.
Główne wady środowiska
Od zawsze zarzucano Javie(tak na prawdę to JVM), że jest bardzo zasobożerna. W rzeczywistości chodziło wyłącznie o zużycie RAMu, gdyż nigdy JVM nie zużywało specjalnie mocy obliczeniowej CPU. Działo się tak, gdyż programiści nigdy nie starali się tej pamięci oszczędzać, Garbage Collector nie działał do końca sprawnie, a do tego JVM ma “tendencję” do alokowania większej ilość pamięci niż potrzeba. Dodatkowo Java zawsze potrafiła trochę “mulić”. A prawda jest inna. Java jest “wolniejsza”, jeśli chodzi o czas wykonywania względem języków jak C, C++ czy Rust, jednak nie jest to taka różnica by człowiek ją mógł zauważyć w formie lagów.
Zatem jakie te zmiany?
Struktura i dostęp w Java 9
Przede wszystkim zmianie ulegnie struktura logiczna JDK, jeśli chodzi o strukturę plików. Stara struktura opierała się na 3 folderach: lib, bin, jre, a następnie jre miała w sobie jeszcze foldery lib i bin. Ten układ został uproszczony do struktury 3 folderów: bin, lib, conf. Oba te układy prezentuje grafika poniżej. Dodatkowo usunięto pliki: tools.jar oraz rt.jar.
Inną zmianą jest wprowadzenie JShell. Jest to interfejs zgodny z REPL, czyli Read-Eval-Print-Loop, występujacy np. w Pythonie. Dzięki temu będziemy mogli przetestować jakieś API ręcznie poprzez JShell, wykonując komendy jak w normalnym CMD(CommandLine).
W Javie 9 zostanie zmieniony też system budowania archiwów .jar. Zostanie on zastąpiony systemem modularnym, podobnym do tego znanego z Maven(zasada zależności i repozytoriów).
W strukturze JVM zmianie uległ jeszcze jeden istotny element: GarbageCollector. Zostanie on w domyśle ustawiony na G1, który znany jest od Javy 1.7, ale był tylko alternatywą, a nie tym używanym domyślnie w trakcie wykonywania kodu naszej aplikacji.
Zmiany w Java 9 API
Zmienione zostanie też dość znacznie Java API. Dodane zostaną ulepszenia do tego co istnieje, ale rownież zostaną niektóre paczki usunięte.
Rozszerzone zostanie API dotyczące “konkurencji”(ang. concurrency API). Chodzi tu przede wszystkim o “Reactive Streams API”, czyli API pomagające streamować dane tak, by nie powodować efektu “back-pressure”, ciśnienia, które odkłada się na procesorze i powoduje spadki wydajności. Poza tym ulepszone będzie wsparcie dla opóźnień i “timeoutów”, dziedziczenie w zakresie podklasowości oraz “kilka” metod. Obok tego jedną z najważniejszych zmian jest dodanie klasy StackWalker, która pozwoli nam szybko przemieszczać się wzdłuż “stack trace’u” naszej paczki.
List frames = StackWalker.getInstance().walk(s ->
s.dropWhile(f -> f.getClassName().startsWith("com.foo."))
.limit(10)
.collect(Collectors.toList()));
W Java 9 nie będzie potrzebne już dodawanie zewnętrznego API czy frameworka do operowania z protokołem HTTP przy wzorcu RESTful – przywitajmy się z HTTP 2.0
Kolejnym udogodnieniem jest dodanie “kopa” Process API Javy. Klasa Process oraz Runtime zapewniały do tej pory dość słabe wsparcie dla komunikacje z powłoką systemową. Od teraz będzie można np. pobrać PID jedną linijką kodu.
System.out.println("Your pid is " + Process.getCurrentPid());
Skoro powiedziane jest co zostanie dodane, to teraz czas powiedzieć co usunięte będzie.
Przede wszystkim usunięte zostało większość paczek sun.*
z internalnego API Javy. Prócz tego nie znajdziemy jeszcze w Java 9 natywnego JSON API, ale to najmniejszy problem, gdyż tych jest bardzo wiele takich jak minimal json API czy Gson API od Google. Oracle nie zdecydowało się jeszcze na dodanie API służącego do przeliczania nominałów i walut w Javie, ale to też nie wydaje się być bardzo dużą stratą w dzisiejszych czasach.
Do tego wszystkiego trzeba jeszcze dodać zaostrzenie interpretacji słowa kluczowego public
. Zmiany dotycząc przede wszystkim interpretacji żądania dostępu do klasy lub struktury danych czy też zmiennej oznaczonej tym słowem kluczowym przy użyciu mechanizmow refleksji.
Podsumowanie
Jak widać bardzo wyraźnie Oracle zapowiada bardzo dużo ciekawych feature’ów w najnowszym wydaniu Javy. Moim zdaniem wszystkie zmiany są bardzo pozytywne i zapowiadają się obiecująco, a co z tego wyjdzie to czas pokaże. W tekście postarałem się wymienić najważniejsze zmiany moim zdaniem, jednak tych zmian jest o wiele, wiele więcej. Wszystkie możecie znaleźć oczywiście w Release notes.
To by było na tyle w tym poście. Trzymajcie się!
WARTO PRZECZYTAĆ: