wydanie Javy SE 16

Po sześciu miesiącach prac firma Oracle wypuściła Java SE 16 (Java Platform, Standard Edition 16), która wykorzystuje projekt OpenJDK jako implementację referencyjną. Java SE 16 zachowuje kompatybilność wsteczną z poprzednimi wydaniami platformy Java; wszystkie wcześniej napisane projekty Java będą działać bez zmian po uruchomieniu w nowej wersji. Gotowe do instalacji kompilacje Java SE 16 (JDK, JRE i Server JRE) przygotowane są dla systemu Linux (x86_64, AArch64), Windows i macOS. Opracowana w ramach projektu OpenJDK referencyjna implementacja Java 16 jest w pełni open source na licencji GPLv2, z wyjątkami GNU ClassPath umożliwiającymi dynamiczne łączenie z produktami komercyjnymi.

Java SE 16 jest klasyfikowana jako wersja z ogólnym wsparciem i będzie otrzymywać aktualizacje aż do następnej wersji. Gałązką wsparcia długoterminowego (LTS) powinna być Java SE 11, która będzie otrzymywać aktualizacje do 2026 roku. Następna wersja LTS zaplanowana jest na wrzesień 2021 r. 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ń.

W ramach przygotowań do nowej wersji programiści przenieśli się z systemu kontroli wersji Mercurial do Git i platformy współpracy programistycznej GitHub. Oczekuje się, że migracja poprawi wydajność operacji na repozytorium, zwiększy efektywność przechowywania, zapewni dostęp do zmian w historii projektu, poprawi obsługę przeglądu kodu i umożliwi interfejsom API automatyzację przepływów pracy. Dodatkowo wykorzystanie Git i GitHub czyni projekt bardziej atrakcyjnym dla początkujących i programistów przyzwyczajonych do Git.

Nowe funkcje w Javie 16 obejmują:

  • Dodano eksperymentalny moduł jdk.incubator.vector z implementacją Vector API, który udostępnia funkcje obliczeń wektorowych wykonywanych przy użyciu instrukcji wektorowych na procesorach x86_64 i AArch64 oraz umożliwia jednoczesne wykonywanie operacji na wielu wartościach (SIMD). W przeciwieństwie do możliwości kompilatora HotSpot JIT w zakresie automatycznej wektoryzacji operacji skalarnych, nowe API umożliwia jawną kontrolę wektoryzacji dla równoległego przetwarzania danych.
  • Kod JDK i VM HotSpot napisany w C++ może korzystać z funkcji wprowadzonych w specyfikacji C++14. Wcześniej dozwolone były standardy C++ 98/03.
  • ZGC (Z Garbage Collector), który działa w trybie pasywnym i maksymalnie minimalizuje opóźnienia spowodowane odśmiecaniem, dodał możliwość równoległego przetwarzania stosów wątków bez wstrzymywania wątków aplikacji. ZGC ma teraz tylko pracę wymagającą zawieszenia, które charakteryzuje się ciągłymi opóźnieniami, zwykle nieprzekraczającymi kilkuset mikrosekund.
  • Dodano obsługę gniazd uniksowych (AF_UNIX) do klas SocketChannel, ServerSocketChannel i java.nio.channels.
  • Zaimplementowano port dla dystrybucji Linuksa Alpine ze standardową biblioteką C musl, która jest popularna w środowiskach kontenerów, mikrousług, systemów chmurowych i wbudowanych. Proponowany port w takich środowiskach pozwala na uruchamianie programów Java jak zwykłych aplikacji. Ponadto za pomocą jlink możesz usunąć wszystkie nieużywane moduły i stworzyć minimalne środowisko wystarczające do uruchomienia aplikacji, co pozwala na tworzenie kompaktowych obrazów specyficznych dla aplikacji.
  • Zaimplementowano mechanizm Elastic Metaspace, optymalizujący operacje alokacji i zwrotu pamięci zajmowanej przez metadane klasy (metaprzestrzeń) w JVM HotSpot. Zastosowanie Elastic Metaspace zmniejsza fragmentację pamięci, zmniejsza obciążenie modułu ładującego klasy, a także ma korzystny wpływ na wydajność długotrwałych aplikacji serwerowych dzięki szybszemu zwrotowi pamięci zajmowanej przez nieużywane metadane klas do systemu operacyjnego. Aby wybrać tryb zwalniania pamięci po wyładowaniu klas, oferowana jest opcja „-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)”.
  • Dodano port JDK dla systemów Windows działających na sprzęcie z procesorami opartymi na architekturze AArch64.
  • Zaproponowano trzecią wersję zapoznawczą interfejsu API Foreign-Memory Access, umożliwiającą aplikacjom Java bezpieczny i wydajny dostęp do obszarów pamięci poza stertą Java poprzez manipulowanie nowymi abstrakcjami MemorySegment, MemoryAddress i MemoryLayout.
  • Zaimplementowano eksperymentalny interfejs API Foreign Linker, zapewniający dostęp z języka Java do kodu natywnego. Wraz z interfejsem API Foreign-Memory nowy interfejs programistyczny znacznie ułatwia tworzenie opakowań w stosunku do konwencjonalnych bibliotek współdzielonych.
  • Dodano narzędzie jpackage, które umożliwia tworzenie pakietów dla samodzielnych aplikacji Java. Narzędzie opiera się na javapackager z JavaFX i umożliwia tworzenie pakietów w formatach natywnych dla różnych platform (msi i exe dla Windows, pkg i dmg dla macOS, deb i obr./min dla Linuksa). Pakiety zawierają wszystkie wymagane zależności.
  • Ścisła enkapsulacja wszystkich elementów wewnętrznych JDK jest domyślnie włączona, z wyjątkiem krytycznych interfejsów API, takich jak sun.misc.Unsafe. Wartość opcji „--illegal-access” jest teraz domyślnie ustawiona na „odmów” zamiast „zezwól”, co będzie blokować próby uzyskania dostępu do większości wewnętrznych klas, metod i pól z poziomu kodu. Aby ominąć to ograniczenie, użyj opcji „-illegal-access=permit”.
  • Ustabilizowano realizację dopasowywania wzorców w operatorze „instanceof”, co pozwala na natychmiastowe zdefiniowanie zmiennej lokalnej, która będzie odnosić się do sprawdzanej wartości. Na przykład możesz od razu napisać „if (obj instancja ciągu s && s.length() > 5) {.. s.contains(..) ..}” bez jawnego definiowania „String s = (String) obj”. Było: if (obj instancja grupy) { Grupa grupa = (Grupa) obj; var wpisy = group.getEntries(); } Teraz możesz obejść się bez definiowania „Group group = (Group) obj”: if (obj instancja Group group) { var wpisy = group.getEntries(); }
  • Ustabilizowano implementację słowa kluczowego „record”, zapewniając zwartą formę definicji klas, która eliminuje potrzebę jawnego definiowania różnych metod niskiego poziomu, takich jak równości(), hashCode() i toString() w przypadkach, gdy przechowywane są dane tylko w polach z którymi się nie zmienia. Gdy klasa korzysta ze standardowych implementacji metod równości(), hashCode() i toString(), może obejść się bez ich jawnej definicji: publiczny rekord BankTransaction(data lokalna, podwójna kwota, opis ciągu) {}

    Ta deklaracja automatycznie doda implementacje metod równości(), hashCode() i toString() oprócz metod konstruktora i gettera.

  • Zaproponowano drugą wersję roboczą dla zapieczętowanych klas i interfejsów, których inne klasy i interfejsy nie mogą używać do dziedziczenia, rozszerzania lub zastępowania implementacji. Klasy zapieczętowane zapewniają również bardziej deklaratywny sposób ograniczenia użycia nadklasy niż modyfikatory dostępu, w oparciu o jawną listę podklas dozwolonych do rozszerzenia. pakiet com.example.geometry; publiczna klasa zapieczętowana Pozwala na kształtowanie com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Źródło: opennet.ru

Dodaj komentarz