Java 11
var (w lambdzie)
Od teraz możemy określić typy parametrów lambda lub pominąć je przy pisaniu wyrażenia lambda (wpisane domyślnie wyrażenia lambda):Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Możesz także dodawać adnotacje do parametrów lambda bez konieczności wpisywania pełnej nazwy typu zmiennej:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z(ZGC)
ZGC to nowy moduł zbierający śmieci, który nie działa. Przydziela nową pamięć, ale nigdy jej nie uruchamia ponownie. ZGC obiecuje zarządzać dużymi ilościami pamięci przy dużej przepustowości i małych opóźnieniach (ZGC jest dostępny tylko na platformach 64-bitowych). Kolorowanie referencyjne — ZGC używa wskaźników 64-bitowych z techniką zwaną kolorowaniem wskaźników. Kolorowe wskaźniki przechowują dodatkowe informacje o obiektach na stercie. Kiedy pamięć ulega fragmentacji, pomaga to uniknąć pogorszenia wydajności, gdy GC musi znaleźć miejsce na nową alokację. Zbiórka śmieci za pomocą ZGC składa się z następujących kroków:- przystanki świata: szukamy punktów początkowych dotarcia do obiektów na stercie (takich jak zmienne lokalne lub pola statyczne);
- przecięcie grafów obiektów zaczynając od łączy głównych. Zaznaczamy każdy obiekt, do którego dotrzemy (ZGC przegląda wykres obiektu i przygląda się kolorowym wskazówkom, zaznaczając dostępne obiekty);
- obsługa niektórych przypadków brzegowych, takich jak słabe łącza;
- przesuwanie żywych obiektów, uwalnianie dużych obszarów sterty w celu przyspieszenia alokacji.
- kiedy rozpoczyna się faza ruchu, ZGC dzieli stertę na strony i pracuje po jednej stronie na raz;
- ZGC kończy ruch wszelkich korzeni i następuje reszta ruchu.
- Wprowadzenie do ZGC: skalowalny i eksperymentalny moduł zbierający śmieci JVM o niskim opóźnieniu
- Domowy moduł zbierający śmieci dla Open JDK
- Nowy moduł Z Garbage Collector (ZGC) w Javie jest bardzo ekscytujący
Epsilon GC
Epsilon to moduł zbierający elementy bezużyteczne, który obsługuje alokację pamięci, ale nie implementuje żadnego prawdziwego mechanizmu odzyskiwania pamięci. Po wyczerpaniu dostępnej sterty Java maszyna JVM zostanie zamknięta. Oznacza to, że jeśli zaczniesz tworzyć obiekt w nieskończonej tablicy bez powiązania z referencją za pomocą tego modułu zbierającego elementy bezużyteczne, aplikacja ulegnie awarii z powodu błędu OutOfMemoryError (a jeśli z jakimkolwiek innym, nie nastąpi, ponieważ wyczyści obiekty bez referencji) . Dlaczego jest to potrzebne? Dlatego:- Test wydajności.
- Testowanie ciśnienia pamięci.
- Testowanie interfejsu maszyny wirtualnej.
- Wyjątkowo krótka praca.
- Ulepszenia opóźnień ostatniej kropli.
- Ulepszenia przepustowości ostatniej kropli.
- Nowy GC Epsilon. Java może nie mieć funkcji wyrzucania elementów bezużytecznych. Zaszokować. Uczucie
- Wprowadzenie do Epsilon GC: eksperymentalny moduł zbierający śmieci bez obsługi
ByteArrayOutputStream
mam metodęvoid writeBytes(byte [])
, która zapisuje wszystkie bajty z argumentu doOutputStream
.FileReader
iFileWriter
otrzymałem nowe konstruktory, które pozwalają określić Charset.Path
pobrał dwie nowe metody,of(String, String [])
zwracaPath
z argumentu typu string ścieżkę lub sekwencję ciągów, które po połączeniu tworzą ciąg ścieżki, aof(URI)
: zwraca ścieżkę z identyfikatora URI.Pattern
— otrzymano metodęasMatchPredicate()
sprawdzającą, czy dany ciąg wejściowy pasuje do danego wzorca (czy pozwala na utworzenie predykatu za pomocą wyrażenia regularnego, dzięki czemu można np. filtrować dane w strumieniu).String
Wybrałem wiele przydatnych metod, takich jak:String strip()
: zwróci nam ciąg będący tym ciągiem, z usuniętymi wszystkimi spacjami na początku i na końcu ciągu (podobnie jak trim(), ale spacje definiuje inaczej);String stripLeading()
: zwróci nam ciąg znaków, który jest tym ciągiem, usuwając wszelkie początkowe spacje z ciągu;String stripTrailing()
: zwróci nam ciąg znaków, który jest tym ciągiem, usuwając spacje na końcu ciągu;Stream lines()
: zwróci namStream
zString
wyodrębnionego z tego ciągu znaków, oddzielonego separatorami linii;String repeat(int)
: zwróci nam ciąg będący konkatenacją tego ciągu, powtórzoną określoną liczbę razy.boolean isBlank()
: zwróci wartość true, jeśli ciąg znaków jest pusty lub zawiera tylko spacje, w przeciwnym razie wartość false.
Thread
— metodyzniszcz() i stop(Throwable) zostały usunięte.Files
mam wiele nowych metod:String readString(Path)
: wczytuje wszystkie dane z pliku do ciągu znaków, dekodując bajty na znaki przy użyciu kodowania UTF-8;String readString(Path, Charset)
: tak samo jak w metodzie powyżej, z tą różnicą, że dekodowanie bajtów na znaki odbywa się przy użyciu określonego zestawu znaków;Path writeString (Path, CharSequence, OpenOption [])
: Zapisuje ciąg znaków do pliku. Znaki są kodowane w bajtach przy użyciu kodowania UTF-8;Path writeString(Path, CharSequence,Charset, OpenOption [])
: Ta sama metoda co powyżej, tylko znaki są kodowane w bajtach przy użyciu kodowania określonego w Charset.
Java 12
Mija sześć miesięcy i widzimy kolejny etap ewolucji Javy. Czas więc wyjąć łopatę wiedzy i kopać.Zaktualizuj G1
W G1 wprowadzono następujące ulepszenia:-
Odzyskaj nieużywaną przydzieloną pamięć
W pamięci sterty Java istnieje coś takiego jak pamięć nieużywana (lub innymi słowy nieaktywna). W Javie 12 postanowili rozwiązać ten problem, teraz:
- G1 zwraca pamięć ze sterty w pełnym GC lub podczas pętli równoległej; G1 próbuje zapobiec pełnemu GC i rozpoczyna pętlę równoległą w oparciu o alokację sterty. Będziemy musieli zmusić G1 do zwrócenia pamięci ze sterty.
To ulepszenie koncentruje się na wydajności poprzez automatyczne zwracanie pamięci ze sterty do systemu operacyjnego, gdy G1 nie jest używany.
-
Przerywanie mieszanych kolekcji po przekroczeniu czasu pauzy
G1 korzysta z silnika analitycznego, aby wybrać ilość pracy wymaganą do usunięcia elementów bezużytecznych. Zbiera żywe obiekty bez zatrzymywania się po zdefiniowaniu zestawu i rozpoczęciu czyszczenia. Powoduje to, że moduł zbierający elementy bezużyteczne przekracza docelowy czas pauzy. W rzeczywistości problem ten został rozwiązany poprzez ulepszenie, ponieważ jeśli czas wykonania następnego kroku przekracza rozsądne granice, etap ten może zostać przerwany.
Mikrobenchmark
W Javie 12 wprowadzono testy mikrobenchmarkingu, dzięki czemu wydajność JVM można łatwo przetestować przy użyciu istniejących testów porównawczych. Byłoby to bardzo przydatne dla każdego, kto chce pracować nad samą maszyną JVM. Dodane testy są tworzone przy użyciu Java Microbenchmark Harness (JMH). Testy te pozwalają na ciągłe testowanie wydajności na maszynie JVM. JEP 230 proponuje wprowadzenie około 100 testów, a nowe testy będą wprowadzane w miarę wydawania nowych wersji Java. Oto przykład dodanych testów .Shenandoah
Jest to algorytm zbierania śmieci (GC), którego celem jest zagwarantowanie krótkiego czasu odpowiedzi (dolny limit to 10-500 ms). Skraca to czas pauzy GC podczas wykonywania prac porządkowych jednocześnie z uruchomionymi wątkami Java. W Shenandoah czas pauzy jest niezależny od wielkości sterty. Oznacza to, że czas pauzy będzie taki sam niezależnie od wielkości sterty. Jest to funkcja eksperymentalna i nie jest zawarta w standardowej (Oracle) wersji OpenJDK.Ulepsz przełącznik
W Javie 12 udoskonalono wyrażenia Switch do dopasowywania wzorców. Wprowadzono nową składnię L →. Oto lista kluczowych punktów nowego przełącznika :- Nowa składnia eliminuje potrzebę stosowania instrukcji break, aby zapobiec błędom.
- Wyrażenia przełączające nie zawodzą już.
- Dodatkowo możemy zdefiniować wiele stałych w jednej etykiecie.
- Domyślna wielkość liter jest teraz wymagana w wyrażeniach przełączających.
- break służy w wyrażeniach Switch do zwracania wartości z samego rejestru (w rzeczywistości przełącznik może zwracać wartości).
var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
Ostateczny przewodnik po przełączaniu wyrażeń w Javie 13 Inne nowe funkcje:
-
String:
transform(Function f)
- Stosuje podaną funkcję do ciągu znaków. Wynikiem może nie być ciąg znaków.indent(int x)
— dodaje x spacji do ciągu. Jeśli parametr jest ujemny, to ta liczba wiodących spacji zostanie usunięta (jeśli to możliwe). -
Files
- złapał metodę taką jakmismatch()
, która z kolei znajduje i zwraca pozycję pierwszego niedopasowanego bajtu w zawartości dwóch plików lub -1L, jeśli nie ma niezgodności. -
Pojawiła się nowa klasa -
CompactNumberFormat
do formatowania liczby dziesiętnej w formie zwartej. Przykładem tej zwartej formy jest 1M zamiast 1 000 000. Zatem wymagane są tylko dwa dwa zamiast dziewięciu znaków. -
Jest też nowy
enum
,NumberFormatStyle
który ma dwie wartości – LONG i SHORT. -
InputStream
mam metodęskipNBytes(long n)
: pomiń n-tą liczbę bajtów ze strumienia wejściowego.
- Java 12 jest już dostępna: co nowego?
- Co nowego w Javie 12
- Co nowego w Javie 12 (z bloga Notatki programisty Wiedźmina)
Jawa 13
Świat nie stoi w miejscu, porusza się, rozwija, tak jak Java - Java 13.Blok tekstowy
Java zawsze trochę cierpiała, jeśli chodzi o definiowanie ciągów znaków. Jeśli musieliśmy zdefiniować linię ze spacją, podziałem linii, cudzysłowem lub czymś innym, powodowało to pewne trudności, więc musieliśmy użyć znaków specjalnych: na przykład \n dla podziału linii lub ucieczki z części linii samo. To znacznie zmniejsza czytelność kodu i zabiera dodatkowy czas przy pisaniu takiej linii. Staje się to szczególnie zauważalne podczas pisania ciągów znaków wyświetlających JSON, XML, HTML itp. W rezultacie, jeśli będziemy chcieli napisać małego Jsona, będzie on wyglądał mniej więcej tak:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
I wtedy na scenę wchodzi Java 13, która oferuje nam swoje rozwiązanie w postaci potrójnych podwójnych cudzysłowów przed i po tekście (które nazywają blokami tekstowymi). Spójrzmy na poprzedni przykład jsona z wykorzystaniem tej innowacji:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
O wiele prościej i jaśniej, prawda? Dodano także odpowiednio String
trzy nowe metody zarządzania tymi blokami:
stripIndent()
: Usuwa losowe spacje z ciągu. Jest to przydatne, jeśli czytasz ciągi wielowierszowe i chcesz zastosować ten sam rodzaj losowego wykluczenia białych znaków, który występuje w przypadku jawnej deklaracji (zasadniczo symulując kompilator w celu usunięcia losowych białych znaków);formatted(Object... args )
: podobny doformat(String format, Object... arg)
, ale dla bloków tekstowych;translateEscapes()
: Zwraca ciąg znaków z sekwencjami specjalnymi (takimi jak \r) przetłumaczonymi na odpowiednią wartość Unicode.
Ulepsz przełącznik
Wyrażenia przełączające zostały wprowadzone w Javie 12, a wersja 13 je udoskonala. W 12 definiujesz zwracane wartości za pomocą break. W 13 wartość zwracaną zastąpiono wydajnością. Teraz wyrażenie przełączające, które mieliśmy w sekcji Java 12, można przepisać jako:var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
Chociaż akceptowanie przerwy przez nas, programistów już zaznajomionych z Javą, było czymś normalnym, było to jednak dość dziwne. Co to jest „łamanie prawdy” próbując mi powiedzieć? Nowe (stosunkowo nowe) słowo kluczowe return jest bardziej przejrzyste i może w przyszłości pojawić się w innych miejscach, w których zwracane są wartości. Osobom mocno zainteresowanym tym tematem polecam zapoznać się z poniższymi materiałami:
Dynamiczne archiwa CDS
CDS – udostępnianie danych klasowych. Umożliwia spakowanie zestawu często używanych klas w archiwum, które może być później załadowane przez wiele instancji JVM. Dlaczego tego potrzebujemy? Faktem jest, że w procesie ładowania klas JVM wykonuje sporo czynności wymagających dużych zasobów, takich jak czytanie klas, przechowywanie ich w strukturach wewnętrznych, sprawdzanie poprawności odczytanych klas, wyszukiwanie i ładowanie klas zależnych itp. ., i dopiero po tym wszystkim klasy są gotowe do pracy. Zrozumiałe jest, że marnuje się dużo zasobów, ponieważ instancje JVM często mogą ładować te same klasy. Na przykład String, LinkedList, Integer. Cóż, albo klasy tej samej aplikacji, a wszystkie z nich są zasobami. Gdybyśmy tylko raz wykonali wszystkie niezbędne kroki, a następnie umieścili przeprojektowane klasy w archiwum, które można było załadować do pamięci kilku maszyn JVM, mogłoby to znacznie zaoszczędzić miejsce w pamięci i skrócić czas uruchamiania aplikacji. Właściwie CDS umożliwia utworzenie właśnie takiego archiwum. Java 9 pozwalała na dodawanie do archiwum tylko klas systemowych. Java 10 — dołącz klasy aplikacji do archiwum. Utworzenie takiego archiwum polega na:- utworzenie listy klas ładowanych przez aplikację;
- tworzenie bardzo potrzebnego archiwum z klasami, które znaleźliśmy.
Zaktualizuj interfejs API gniazda
Interfejs API gniazd ( java.net.Socket i java.net.ServerSocket ) jest zasadniczo integralną częścią języka Java od jego powstania, ale gniazda nigdy nie były aktualizowane w ciągu ostatnich dwudziestu lat. Napisane w C i Javie, były bardzo, bardzo nieporęczne i trudne w utrzymaniu. Ale Java 13 zdecydowała się wprowadzić własne poprawki w tej całej sprawie i zastąpiła podstawową implementację. Teraz zamiast PlainSocketImpl interfejs dostawcy został zastąpiony przez NioSocketImpl . Ta nowa, kodowana implementacja opiera się na tej samej infrastrukturze zaplecza, co java.nio . Zasadniczo klasa wykorzystuje pamięć podręczną bufora java.util.concurrent i mechanizm blokujący (oparty na segmentach), a nie metody zsynchronizowane. Nie wymaga już kodu natywnego, co ułatwia przenoszenie na różne platformy. Nadal mamy sposób na powrót do używania PlainSocketImpl , ale od tej pory domyślnie używany jest NioSocketImpl .Powrót pamięci dla ZGC
Jak pamiętamy, moduł zbierający elementy bezużyteczne Z został wprowadzony w Javie 11 jako mechanizm usuwania elementów bezużytecznych o niskim opóźnieniu, dzięki czemu pauza GC nigdy nie przekracza 10 ms. Ale jednocześnie, w przeciwieństwie do innych wirtualnych HotSpotów GC, takich jak Shenandoah i G1, może zwrócić nieużywaną pamięć dynamiczną do systemu operacyjnego. Ta modyfikacja dodaje tę możliwość J do ZGC. W związku z tym uzyskujemy zmniejszone zużycie pamięci wraz z lepszą wydajnością, a ZGC teraz domyślnie zwraca niezatwierdzoną pamięć do systemu operacyjnego, aż do osiągnięcia określonego minimalnego rozmiaru sterty. Jeszcze jedno: ZGC ma teraz maksymalny obsługiwany rozmiar sterty wynoszący 16 TB. Wcześniej limitem było 4 TB. Inne innowacje:javax.security
- dodano opcjęjdk.sasl.disabledMechanisms
wyłączającą mechanizmy SASL.java.nio
- dodano metodęFileSystems.newFileSystem (Path, Map <String,?>)
- odpowiednio utworzenia nowego pliku.- Klasy
java.nio
mają teraz metody bezwzględne (w przeciwieństwie do względnych)get
iset
-. Zawierają one, podobnie jak podstawowa klasa abstrakcyjnaBuffer
, metodęslice()
pobierania części bufora. - Dodano
javax.xml.parsers
metody tworzenia instancji fabryk DOM i SAX (z obsługą przestrzeni nazw). - Obsługa Unicode została zaktualizowana do wersji 12.1.
- Java 13: Nowe funkcje
- Wszystko o Javie 13: zanurzenie się w świecie aktualizacji
- 81 nowych funkcji i interfejsów API w JDK 13
GO TO FULL VERSION