życie, • Wcześniej: • mniejsze firmy, • startup, który stał się korpo ;-), • startupy, • konsulting, • Aktualnie: • Staff Software Engineer w Starburst Data, • @wendigo na Twitterze i Githubie 2
problemy chcemy nią rozwiązać? • 10 lat rozwoju języka i platformy: • Rozwój za czasów Oracle, • Jak ugryźć migrację, • Jakie problemy adresują nowe wydania, • Czy Java ma jeszcze przyszłość? 3
Federacja dostępu do danych (Data Mesh, Data Virtualization) Deployment na dowolnej infrastrukturze (cloud, on premise) Uniwersalność zastosowań (ETL, ad-hoc, batch) Aktywne i różnorodne community Otwarty i darmowy kod źródłowy (Apache License 2.0)
poprawny obliczeniowo, • bezpieczny i wydajny, • skaluje się na najnowszym hardwarze, • rozwiązuje realne problemy, • Produkt który, łatwo się wdraża: • na różne architektury sprzętowe i systemy, • poprzez brak natywnych zależności, • samowystarczalne artefakty 6 https://trino.io/development/vision.html
vs wydajność wykonania, • Skalowalność i multiplatformowość, • Ekosystem bibliotek, narzędzi i specjalistów, • Dostęp niskopoziomowy do zasobów, • Kompatybilność wsteczna, • Automatyczne zarządzanie pamięcią, • 10 lat temu nie było większego wyboru ;-) 7
Incubator (https://openjdk.org/jeps/11): • Całe moduły zawierające niesfinalizowane API i narzędzia, • Mogą, ale nie muszą być w całości usunięte/zmienione w przyszłości, • Preview (https://openjdk.org/jeps/12): • W pełni wyspecyfikowana, zaimplementowana funkcjonalność języka lub JVMa, • Może stać się finalna i publiczna w przyszłości. 9
• 6 miesięcy na wydanie, 6 miesięcy na krytyczne błędy bezpieczeństwa, • Wydanie LTS ma wsparcie: • 5 lat na wydanie, 8 lat na krytyczne błędy bezpieczeństwa, • Duże przedsiębiorstwa korzystają tylko z LTSów, • Z doświadczenia: • większa stabilność, • mniejsza liczba regresji (dłuższy okres integracji i testowania) 11
a zewnętrznymi (nie-javowymi) API, np. kodem natywnym napisanym w C, C++ itp” 2. Valhalla (2014): “Rozszerzenie modelu obiektowego Javy o obiekty wartościowe (value objects) i typy prymitywne zdefiniowane przez użytkownika, łącząc ze sobą abstrakcje programowania obiektowego z wydajnością charakterystyczną dla typów prymitywnych” 3. Amber (2016): “Odkrycie i wprowadzenie małych, zorientowanych na poprawnie produktywność funkcjonalności języka Java” 4. Loom (2018): “Drastyczne zredukowanie kosztu wytworzenia, utrzymania i monitorowania współbieżnych aplikacji o dużej przepustowości, wykorzystujących w pełni potencjał dostępnych platform sprzętowych” 12
uruchamia się na nowej, • Możemy testować kompatybilność w przód, • Możemy nadal wspierać wcześniejsze wersje, • Compile target (trudniejsze): • Kod skompilowany nowszą wersją i na niej uruchamiany, • Nowy class format, • Pozwala wykorzystać nowe możliwości języką i API (language level), • Nie ma drogi powrotu :( 16
wersje bibliotek: • Nowy class format (ASM, ByteBuddy), • Niedozwolona/nieprawidłowa refleksja (od JDK 16), • Grzebanie w internalach Javy 😑 (Unsafe, ByteBuffer, compiler API itp), • Brak wsparcia dla nowych elementów języka (np. Record class), • Niekompatybilny tooling: • pluginy Maven’a, • infrastruktura testowa (obrazy Docker-owe, Github Actions, Jenkins itp), • wsparcie IDE ;-) 17
level: • Java 8 - 02.2014 (+6 mc za wydaniem) • Java 11 - 02.2020 (+18 mc za wydaniem) • Java 17 - 11.2021 (+3 mc za wydaniem) • Java 21 - 12.2023 (+3 mc za wydaniem)
API, • słowo kluczowe var (local type inference), • metody fabryczne dla niemutowalnych kolekcji i ich kopiowania, • nowa implementacja klienta HTTP, • jshell 20
(w JDK 16), • Problem ze starymi bibliotekami: • zmiany w zakresie security: • SecurityManager (deprecated), • Kerberos, • wycofane algorytmy, • Niekompatybilne pluginy Mavena, • Kilka niespodzianek: • zmiana InetSocketAddress::toString (JDK-8225499), • wycofany -XX:+UseBiasedLocking, • strictfp domyślnie, 31
Mają sens dla kodu I/O-intensive: • kod musi być Loom-friendly by współpracować ze schedulerem, • synchronized method & synchronized (object) nie są kooperatywne, • można rozwiązać za pomocą ReentrantLock-ów, • ExecutorService implements AutoCloseable, • Brak obsługi priorytetów, thready są zawsze daemon, • Kosztowna obsługa ThreadLocal-i, • -Djdk.tracePinnedThreads=full/short na ratunek
patterns, • JEP 441: Pattern matching for switch, • JEP 430: String templates (preview), • JEP 445: Unnamed classed and instance main methods (preview), • JEP 439: Generational ZGC, • JEP 431: Sequenced Collections.
mavena: • nowy class format (ASM), • zmianami w internalach compiler API, • Kilka niespodzianek: • Zmiana konstruktora DirectByteBuffera: JDK-8299684, • Zmiana reprezentacji Double i Float.toString: JDK-4511638 39