Wydanie platformy Java SE 22 i implementacji otwartej referencji OpenJDK 22

Po sześciu miesiącach prac rozwojowych firma Oracle wydała platformę Java SE 22 (Java Platform, Standard Edition 22), która wykorzystuje projekt open source OpenJDK jako implementację referencyjną. Z wyjątkiem usunięcia niektórych przestarzałych funkcji, Java SE 22 zachowuje kompatybilność wsteczną z poprzednimi wersjami platformy Java — większość wcześniej napisanych projektów Java będzie nadal działać bez modyfikacji, gdy zostaną uruchomione w nowej wersji. Gotowe do zainstalowania wersje Java SE 22 (JDK, JRE i Server JRE) są przygotowane dla systemów Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Opracowana w ramach projektu OpenJDK implementacja referencyjna Java 22 jest w pełni otwarta na licencji GPLv2 z wyjątkami GNU ClassPath, aby umożliwić dynamiczne łączenie z produktami komercyjnymi.

Java SE 22 jest klasyfikowana jako zwykła wersja wsparcia i będzie otrzymywać aktualizacje aż do następnej wersji. Gałązką Long Term Support (LTS) powinna być Java SE 21 lub Java SE 17, które otrzymają aktualizacje odpowiednio do 2031 i 2029 roku (ogólnie dostępne do 2028 i 2026 roku). Publiczne wsparcie dla gałęzi LTS Java SE 11 zakończyło się we wrześniu ubiegłego roku, ale przedłużone wsparcie będzie kontynuowane do 2032 roku. Rozszerzone wsparcie dla gałęzi LTS Java SE 8 będzie kontynuowane do 2030 roku.

Przypomnijmy, że począwszy od wydania Java 10, projekt przeszedł na nowy proces rozwoju, co oznacza krótszy cykl tworzenia nowych wydań. Nowa funkcjonalność jest teraz rozwijana w jednej, stale aktualizowanej gałęzi głównej, która zawiera gotowe zmiany i z której co sześć miesięcy rozgałęziają się gałęzie w celu stabilizacji nowych wydań.

Nowe funkcje w Javie 22 obejmują:

  • Moduł zbierający elementy bezużyteczne G1 obsługuje przypinanie regionów, co pozwala tymczasowo ustalić lokalizację obiektów Java w pamięci, aby uniknąć ich przenoszenia przez moduł wyrzucający elementy bezużyteczne i umożliwić bezpieczne przekazywanie odniesień do tych obiektów między językiem Java a kodem natywnym. Przypinanie pozwala zmniejszyć opóźnienia i uniknąć wyłączania wyrzucania elementów bezużytecznych podczas wykonywania krytycznych regionów JNI (Java Native Interface) z kodem natywnym (podczas wykonywania tych sekcji maszyna JVM nie powinna przenosić powiązanych z nimi krytycznych obiektów, aby uniknąć sytuacji wyścigowych). Przypinanie usuwa krytyczne obiekty z pola widzenia modułu wyrzucania elementów bezużytecznych, który może w dalszym ciągu czyścić nieprzypięte obszary.
  • Dodano wstępną funkcję umożliwiającą określanie wyrażeń w konstruktorach przed wywołaniem super(...), używaną do jawnego wywoływania konstruktora klasy nadrzędnej z konstruktora klasy dziedziczonej, jeśli wyrażenia te nie odnoszą się do instancji utworzonej przez konstruktor. klasa Zewnętrzna { void hello() { System.out.println("Hello"); } klasa Wewnętrzna { Wewnętrzna() { hello(); Super(); } } }
  • Ustabilizowano interfejs API FFM (Foreign Function & Memory), umożliwiając interakcję programów Java z zewnętrznym kodem i danymi poprzez wywoływanie funkcji z zewnętrznych bibliotek i uzyskiwanie dostępu do pamięci poza JVM, bez uciekania się do korzystania z JNI (Java Native Interface).
  • Włączono obsługę nienazwanych zmiennych i dopasowywania wzorców - zamiast nieużywanych, ale niezbędnych zmiennych i wzorców podczas wywoływania, można teraz określić znak „_”. // był String pageName = przełącznik (strona) { case GitHubIssuePage(var url, var content, var linki, int numer wydania) -> „NR PROBLEMU” + numer wydania; ... }; // teraz możesz String pageName = switch (page) { case GitHubIssuePage(_, _, _, int IssueNumber) -> „ISSUE #” + IssueNumber; };
  • Zaproponowano wstępną implementację interfejsu API Class-File do analizowania, generowania i konwertowania plików klas Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bajty); bajt[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instancja MethodModel mm && mm.methodName().stringValue(). zaczynaWith("debug"))) { classBuilder.with(ce); } } });
  • Narzędzie Java umożliwia uruchamianie programów Java, dostarczanych w postaci kilku plików kodu lub prekompilowanych bibliotek klas, bez osobnego kompilowania tych plików i bez konfigurowania systemu kompilacji. Nowa funkcja ułatwia uruchamianie programów, w których kod różnych klas jest podzielony na osobne pliki. Prog.java: klasa Prog {public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Witam!"); } }

    Przykładowo, aby uruchomić program składający się z dwóch plików „Prog.java” i „Helper.java” wystarczy teraz uruchomić „java Prog.java”, który skompiluje klasę Prog, zdefiniuje odwołanie do klasy Helper, znajdź i skompiluj plik Helpera.Java i wywołaj metodę główną.

  • Dodano drugą wstępną implementację szablonów ciągów, zaimplementowaną oprócz literałów ciągów i bloków tekstowych. Szablony ciągów umożliwiają łączenie tekstu z wyrażeniami obliczeniowymi i zmiennymi bez użycia operatora +. Podstawianie wyrażeń odbywa się za pomocą podstawień \{..}, można też podłączyć specjalne procedury obsługi sprawdzające poprawność podstawionych wartości. Przykładowo silnik SQL sprawdza wartości podstawiane do kodu SQL i jako wyjście zwraca obiekt java.sql.Statement, natomiast procesor JSON monitoruje poprawność podstawień JSON i zwraca obiekt JsonNode. Zapytanie tekstowe = „WYBIERZ * Z Osoby p WHERE p.” + właściwość + " = '" + wartość + "'"; // was Zapytanie instrukcji = SQL."""SELECT * FROM Osoba p WHERE p.\{właściwość} = '\{wartość}'"""; // stał się
  • Dodano siódmą wersję zapoznawczą Vector API, udostępniającą funkcje obliczeń wektorowych, które są wykonywane przy użyciu instrukcji wektorowych na procesorach x86_64 i AArch64 oraz umożliwiającą jednoczesne stosowanie operacji na wielu wartościach (SIMD). W przeciwieństwie do możliwości kompilatora HotSpot JIT do automatycznej wektoryzacji operacji skalarnych, nowy interfejs API umożliwia jawną kontrolę wektoryzacji dla równoległego przetwarzania danych.
  • Dodano wstępną implementację rozszerzonego Stream API, która umożliwia definiowanie własnych operacji pośrednich, co może być przydatne w przypadkach, gdy istniejące wbudowane operacje pośrednie nie są wystarczające do pożądanej transformacji danych. Natywne procedury obsługi są łączone przy użyciu nowej operacji pośredniej Stream::gather(Gatherer), która przetwarza elementy strumienia, stosując do nich procedurę obsługi określoną przez użytkownika. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • Do testów zaproponowano drugą wersję eksperymentalnego API dla Structured Concurrency, która upraszcza tworzenie aplikacji wielowątkowych poprzez przetwarzanie wielu zadań wykonywanych w różnych wątkach w jednym bloku.
  • Dodano drugą wstępną implementację niejawnie zadeklarowanych klas i nienazwanych instancji metody „main”, która może obejść się bez deklaracji publicznych/statycznych, przekazywania tablicy argumentów i innych elementów powiązanych z deklaracją klasy. // była klasą publiczną HelloWorld { public static void main(String[] args) { System.out.println("Witaj, świecie!"); } } // teraz możesz wykonać void main() { System.out.println("Witaj, świecie!"); }
  • Dodano drugą wersję zapoznawczą implementacji Scoped Values, umożliwiającą współdzielenie niezmiennych danych pomiędzy wątkami i efektywną wymianę danych pomiędzy wątkami podrzędnymi (wartości są dziedziczone). Scoped Values ​​są opracowywane w celu zastąpienia mechanizmu zmiennych lokalnych wątków i są bardziej wydajne przy użyciu bardzo dużej liczby wątków wirtualnych (tysiące lub miliony wątków). Główna różnica między wartościami o określonym zasięgu a zmiennymi lokalnymi wątku polega na tym, że te pierwsze są zapisywane raz, nie można ich zmienić w przyszłości i pozostają dostępne tylko przez czas wykonywania wątku.
  • Równoległy moduł zbierający elementy bezużyteczne poprawił wydajność podczas pracy z dużymi tablicami obiektów. Optymalizacja umożliwiła w niektórych testach z dużymi tablicami obiektów zmniejszenie opóźnienia przed rozpoczęciem wyszukiwania obiektu o 20%.

Dodatkowo można odnotować publikację aktualizacji platformy do tworzenia aplikacji z interfejsem graficznym JavaFX 22.

Źródło: opennet.ru

Dodaj komentarz