Автор оригинала: mkyong.
Java 16 стала общедоступной 16 марта 2021 года, загрузите Java 16 здесь .
Java 16 содержит 17 элементов JEP.
- 1. JEP 338: Векторный API (Инкубатор)
- 2. JEP 347: Включить функции языка C++14
- 3. JEP 357: Переход с Mercurial на Git
- 4. JEP 369: Переход на GitHub
- 5. JEP 376: ZGC: Параллельная обработка стека потоков
- 6. JEP 380: Каналы сокетов Unix-Домена
- 7. JEP 386: Порт Alpine для Linux
- 8. JEP 387: Эластичное Метапространство
- 9. JEP 388: Порт Windows/AArch64
- 10. JEP 389: API внешнего компоновщика (Инкубатор)
- 11. JEP 390: Предупреждения для классов, основанных на значениях
- 12. JEP 392: Упаковочный инструмент
- 13. JEP 393: API доступа к внешней памяти (Третий инкубатор)
- 14. JEP 394: Сопоставление с образцом, например
- 15. ДЖИП 395: Записи
- 16. JEEP 396: По умолчанию сильно инкапсулируйте внутренние компоненты JDK
- 17. JEP 397: Закрытые классы (Второй предварительный просмотр)
- Скачать Исходный Код
- Рекомендации
Функции разработчика Java 16.
пакет, записи (стандарт), сопоставление с образцом (стандарт), запечатанные типы (второй предварительный просмотр), API доступа к внешней памяти (третий инкубатор), API внешнего компоновщика для замены JNI (инкубатор), векторные API (инкубатор)
1. JEP 338: Векторный API (Инкубатор)
Java поддерживает автоматическую векторизацию для оптимизации арифметических алгоритмов, что означает, что Java ( JIT-компилятор ) автоматически преобразует некоторые скалярные операции (по одному элементу за раз) в векторные операции (несколько элементов за раз); Однако разработчики не контролируют преобразование этой векторной операции, оптимизация кода полностью зависит от JIT-компилятора, кроме того, не все скалярные операции преобразуемы.
В этом JEEP представлены новые векторные API-интерфейсы, позволяющие разработчикам явно выполнять векторные операции.
- Векторный процессор обрабатывает несколько данных одновременно, известный как одна инструкция, несколько данных (SIMD) .
- Скалярный процессор обрабатывает одновременно только одни данные, известные как одиночная инструкция, одиночные данные (SISD) .
Дальнейшее Чтение
- JEP 338: Векторный API (Инкубатор)
- Автоматическая векторизация в Java
- Java 17 JEP 414: Векторный API (Второй инкубатор)
2. JEP 347: Включить функции языка C++14
Этот JEP позволяет использовать [функции C++14]((https://en.wikipedia.org/wiki/C%2B%2B14 ) для использования в исходном коде C++ в JDK.
Дальнейшее Чтение
3. JEP 357: Переход с Mercurial на Git
Этот JEP переносит исходный код OpenJDK с Mercurial на Git или GitHub, относится к приведенному ниже JEP 369
Причины перехода на Git:
- Размер файла метаданных системы управления версиями (Mercurial) слишком велик.
- Доступный инструмент
- Доступный хостинг
Дальнейшее Чтение
4. JEP 369: Переход на GitHub
Этот JEEP присоединяется к вышеупомянутому JEP 357 , переносит исходный код OpenJDK из Mercurial в GitHub .
Дальнейшее Чтение
5. JEP 376: ZGC: Параллельная обработка стека потоков
Этот JEEP улучшает сборщик мусора Z (GC), перемещая обработку стека потоков GC из безопасных точек в параллельную фазу.
История
- Java 11 JEP 333 представила сборщик мусора Z (GC) в качестве экспериментального сборщика мусора.
- Java 15 JEP 377 , ZGC стал особенностью продукта.
Дальнейшее Чтение
6. JEP 380: Каналы сокетов Unix-Домена
Сокеты Unix-домена используются для межпроцессной связи (IPC) на одном хосте, что означает обмен данными между процессами, выполняемыми на одном хосте. Сокеты Unix-домена похожи на сокеты TCP/IP, за исключением того, что они адресуются по именам путей файловой системы, а не по адресам Интернет-протокола (IP) и номерам портов. Большинство платформ Unix, Windows 10 и Windows Server 2019, также поддерживали сокеты Unix-домена.
Этот JEP добавляет сокет Unix-домена (AF_UNIX) поддержку существующего Сокет-канал и серверный канал .
Новые классы сокетов или API для домена Unix:
- Новый класс адреса сокета,
java.net . Адрес сокета доменов Unix
- Новый
перечисление
,java.net . Стандартное семейство. UNIX-система
Дальнейшее Чтение
7. JEP 386: Порт Alpine для Linux
Этот JEP переносит JDK в Alpine Linux и другие дистрибутивы Linux, использующие реализацию musl . Этот порт JDK позволяет Java работать “из коробки” в Alpine Linux, что выгодно для таких Java-зависимых платформ или инструментов, как Tomcat и Spring.
P.S Alpine Linux содержит изображения небольшого размера, широко используемые в облачных развертываниях, микросервисах и контейнерных средах.
Дальнейшее Чтение
8. JEP 387: Эластичное Метапространство
Java 8 JEP122 удалил PermGen (Постоянное поколение) и представил Metaspace , собственный менеджер памяти вне кучи в точке доступа.
Этот JEP улучшает управление памятью метапространства, возвращая неиспользуемые Класс Hotspot – метаданные или память метапространства в операционную систему быстрее, сокращая объем метапространства и упрощая код метапространства.
Дальнейшее Чтение
9. JEP 388: Порт Windows/AArch64
Этот JEP переносит JDK в Windows/AArch64 под управлением JDK+ Windows на оборудовании ARM, сервере или ноутбуке на базе ARM.
P.S Windows/AArch64 является популярным спросом на рынке конечных пользователей.
Дальнейшее Чтение
10. JEP 389: API внешнего компоновщика (Инкубатор)
Этот JEP позволяет Java-коду вызывать или может быть вызван машинным кодом, написанным на других языках, таких как C или C++, замените Собственный интерфейс Java (JNI)
P.S Это инкубационная функция; нужно добавить — добавить модули jdk.инкубатор.иностранный для компиляции и запуска кода Java.
10.1 В приведенном ниже примере показано, как использовать API-интерфейсы внешнего компоновщика для вызова стандартной библиотеки C strlen
для возврата длины строки.
size_t strlen(const char *s);
import jdk.incubator.foreign.*; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodType; import static jdk.incubator.foreign.CLinker.C_LONG; import static jdk.incubator.foreign.CLinker.C_POINTER; // Java call standard C library // size_t strlen(const char *s); public class CStrLen { public static void main(String[] args) throws Throwable { if (args.length == 0) { throw new IllegalArgumentException("Please provide an argument."); } String input = args[0]; MethodHandle strlen = CLinker.getInstance().downcallHandle( LibraryLookup.ofDefault().lookup("strlen").get(), MethodType.methodType(long.class, MemoryAddress.class), FunctionDescriptor.of(C_LONG, C_POINTER) ); try (MemorySegment str = CLinker.toCString(input)) { long len = (long) strlen.invokeExact(str.address()); // 5 System.out.println(len); } } }
Компиляция с включенными модулями инкубатора.
$ javac --add-modules jdk.incubator.foreign CStrLen.java warning: using incubating module(s): jdk.incubator.foreign 1 warning
Запуск с включенными модулями инкубатора.
$ java --add-modules jdk.incubator.foreign -Dforeign.restricted=permit CStrLen mkyong WARNING: Using incubator modules: jdk.incubator.foreign 6
10.2 Ниже приведен еще один пример вызова функции, определенной в коде на языке Си.
Простая функция C для печати hello world.
#includevoid printHello() { printf("hello world!\n"); }
Скомпилируйте приведенный выше код C и выведите его в общую библиотеку hello.so
.
$ gcc -c -fPIC hello.c $ gcc -shared -o hello.so hello.o
Под программой Java найдите hello.so
и вызовите его метод напечатать Привет
.
import jdk.incubator.foreign.CLinker; import jdk.incubator.foreign.FunctionDescriptor; import jdk.incubator.foreign.LibraryLookup; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodType; import java.nio.file.Path; import java.util.Optional; public class JEP389 { public static void main(String[] args) throws Throwable { Path path = Path.of("/home/mkyong/projects/core-java/java-16/hello.so"); LibraryLookup libraryLookup = LibraryLookup.ofPath(path); OptionaloptionalSymbol = libraryLookup.lookup("printHello"); if (optionalSymbol.isPresent()) { LibraryLookup.Symbol symbol = optionalSymbol.get(); FunctionDescriptor functionDescriptor = FunctionDescriptor.ofVoid(); MethodType methodType = MethodType.methodType(Void.TYPE); MethodHandle methodHandle = CLinker.getInstance().downcallHandle( symbol.address(), methodType, functionDescriptor); methodHandle.invokeExact(); } } }
Компилировать.
$ javac --add-modules jdk.incubator.foreign JEP389.java warning: using incubating module(s): jdk.incubator.foreign 1 warning
Бежать.
$ java --add-modules jdk.incubator.foreign -Dforeign.restricted=permit JEP389 WARNING: Using incubator modules: jdk.incubator.foreign hello world!
История
- Java 14 JEP 370 представил API доступа к внешней памяти (Инкубатор).
- Java 15 JEP 383 представил API доступа к внешней памяти (Второй инкубатор).
- Java 16 JEP 389 представил API внешнего компоновщика (Инкубатор).
- Java 16 JEP 393 представил API доступа к внешней памяти (Третий инкубатор).
- Java 17 JEP 412 представил API внешних функций и памяти (Инкубатор).
Дальнейшее Чтение
11. JEP 390: Предупреждения для классов, основанных на значениях
Этот JEP предоставляет новое предупреждение, если мы синхронизируем экземпляры классов на основе значений ; Также не рекомендуется удалять конструкторы класса-оболочки примитивов (на основе значений) для удаления.
11.1 Как определить классы, основанные на ценности? Аннотация @jdk.internal. Основанный на значениях
указывает, является ли класс классом, основанным на значениях. Просмотрите следующие два класса, и мы можем сказать, что оба класса – примитивные оболочки Двойной
и Необязательно
являются классами, основанными на значениях.
package java.util; @jdk.internal.ValueBased public final class Optional{ //... }
package java.lang; @jdk.internal.ValueBased public final class Double extends Number implements Comparable, Constable, ConstantDesc { //... }
Примечание Ссылаться JEP 390: Предупреждения для классов, основанных на значениях для полного списка классов, основанных на значениях.
11.2 Ниже приведен пример попытки синхронизировать
класс, основанный на значениях.
public class JEP390 { public static void main(String[] args) { Double d = 20.0; synchronized (d) {} // javac warning & HotSpot warning } }
Скомпилируйте приведенный выше код и получите новое предупреждение.
$ javac JEP390.java JEP390.java:7: warning: [synchronization] attempt to synchronize on an instance of a value-based class synchronized (d) {} // javac warning & HotSpot warning ^ 1 warning
11.3 Java 9 устарела для конструкторов класса-оболочки примитивов (на основе значений) и теперь помечена для удаления.
package java.lang; //... @jdk.internal.ValueBased public final class Double extends Number implements Comparable, Constable, ConstantDesc { @Deprecated(since="9", forRemoval = true) public Double(double value) { this.value = value; } @Deprecated(since="9", forRemoval = true) public Double(String s) throws NumberFormatException { value = parseDouble(s); } //... }
Дальнейшее Чтение
Речь идет о типах значений в будущем выпуске?
12. JEP 392: Упаковочный инструмент
ДЖИП переместил инструмент jpackage
из jdk.incubator.package
в jdk.package
и стал стандартом или функцией продукта в Java 16. Этот пакет
представляет собой упаковочный инструмент для упаковки Java-приложения в пакет для конкретной платформы, такой как:
- Linux: deb и обороты в минуту
- macOS: pkg и dmg
- Windows: msi и exe-файлы
История
- Java 14 JEP 343 представила инструмент инкубации
jpackage
, и он остался инструментом инкубации в Java 15.
12.1 В приведенном ниже примере показано использование пакета
для упаковки простой программы Java Swing в формат deb
в системе Linux (Ubuntu).
Простая программа Java Swing для отображения приветственного мира.
import javax.swing.*; import java.awt.*; public class JEP392 { public static void main(String[] args) { JFrame frame = new JFrame("Hello World Java Swing"); // display frame site frame.setMinimumSize(new Dimension(800, 600)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // center the JLabel JLabel lblText = new JLabel("Hello World!", SwingConstants.CENTER); // add JLabel to JFrame frame.getContentPane().add(lblText); // display it frame.pack(); frame.setVisible(true); } }
Создайте файл jar
и пакет
в пакет для конкретной платформы; поскольку это тестируется в системе Ubuntu, он создаст файл .deb
.
# compile $ javac JEP392.java # create a jar file $ jar cvf hello.jar JEP392.class # package the jar file into platform-specific package $ /opt/jdk-16/bin/jpackage -i . -n JEP392 --main-jar hello.jar --main-class JEP392 # The jpackage created this jep392_1.0-1_amd64.deb $ ls -lsah 4.0K -rw-rw-r-- 1 mkyong mkyong 994 Mac 15 13:52 hello.jar 30M -rw-r--r-- 1 mkyong mkyong 30M Mac 15 14:01 jep392_1.0-1_amd64.deb
sudo dpkg -i jep392_1.0-1_amd64.deb Selecting previously unselected package jep392. (Reading database ... 225576 files and directories currently installed.) Preparing to unpack jep392_1.0-1_amd64.deb ... Unpacking jep392 (1.0-1) ... Setting up jep392 (1.0-1) ... $ ls -lsah /opt/jep392/bin/JEP392 1.6M -rwxr-xr-x 1 root root 1.6M Mac 15 14:01 /opt/jep392/bin/JEP392
Каталог установки по умолчанию на
- Linux – это
/выбор
- mac OS – это
/Приложения
- Windows – это
C:\Program Файлы\
P.S Это может быть отменено с помощью jpackage –установить-реж. вариант.
Запустите установленную программу Java Swing.
$ /opt/jep392/bin/JEP392
Выход
пакет -h
всегда твой лучший друг:
$ /opt/jdk-16/bin/jpackage -h Usage: jpackageSample usages: -------------- Generate an application package suitable for the host system: For a modular application: jpackage -n name -p modulePath -m moduleName/className For a non-modular application: jpackage -i inputDir -n name \ --main-class className --main-jar myJar.jar From a pre-built application image: jpackage -n name --app-image appImageDir Generate an application image: For a modular application: jpackage --type app-image -n name -p modulePath \ -m moduleName/className For a non-modular application: jpackage --type app-image -i inputDir -n name \ --main-class className --main-jar myJar.jar To provide your own options to jlink, run jlink separately: jlink --output appRuntimeImage -p modulePath -m moduleName \ --no-header-files [ ...] jpackage --type app-image -n name \ -m moduleName/className --runtime-image appRuntimeImage Generate a Java runtime package: jpackage -n name --runtime-image //...
Дальнейшее Чтение
13. JEP 393: API доступа к внешней памяти (Третий инкубатор)
API-интерфейсы доступа к внешней памяти позволяют Java API получать доступ к внешней памяти за пределами кучи Java, такой как memcached , Lucene и т.д.
Этот JEP обновил API-интерфейсы доступа к внешней памяти и остался в качестве модуля инкубатора .
История
- Java 14 JEP 370 представил API доступа к внешней памяти (Инкубатор).
- Java 15 JEP 383 представил API доступа к внешней памяти (Второй инкубатор).
- Java 16 JEP 389 представил API внешнего компоновщика (Инкубатор).
- Java 16 JEP 393 представил API доступа к внешней памяти (Третий инкубатор).
- Java 17 JEP 412 представил API внешних функций и памяти (Инкубатор).
Дальнейшее Чтение
14. JEP 394: Сопоставление с образцом, например
Сопоставление шаблонов для экземпляра
является стандартной функцией или функцией продукта в Java 16.
Перед сопоставлением с шаблоном мы проверяем тип объекта и приводим его к переменной вручную.
if (obj instanceof String) { String s = (String) obj; // cast }
Теперь мы можем проверить тип объекта и привести его автоматически
if (obj instanceof String s) { //... s is a string }
Например, ниже приведен общий пример проверки и приведения.
if (obj instanceof String) { String s = (String) obj; if (s.length() > 5) { if (s.equalsIgnoreCase("java16")) { //... } } }
И мы можем реорганизовать приведенный выше код, используя новый экземпляр
.
if (obj instanceof String s && s.length() > 5) { if (s.equalsIgnoreCase("java16")) { //... } }
История
- Java 14 JEP 305 , первый предварительный просмотр.
- Java 15 JEP 375 , второй предварительный просмотр.
- Java 16, стандартная функция.
Дальнейшее Чтение
- JEP 394: Сопоставление шаблонов, например
- Ява 17 JEP 406: Сопоставление шаблонов для переключателя (предварительный просмотр)
15. ДЖИП 395: Записи
Запись
завершена и становится стандартной функцией.
package com.mkyong.java16.jep395; public class JEP395 { record Point(int x, int y) { } public static void main(String[] args) { Point p1 = new Point(10, 20); System.out.println(p1.x()); // 10 System.out.println(p1.y()); // 20 Point p2 = new Point(11, 22); System.out.println(p2.x()); // 11 System.out.println(p2.y()); // 22 Point p3 = new Point(10, 20); System.out.println(p3.x()); // 10 System.out.println(p3.y()); // 20 System.out.println(p1.hashCode()); // 330 System.out.println(p2.hashCode()); // 363 System.out.println(p3.hashCode()); // 330 System.out.println(p1.equals(p2)); // false System.out.println(p1.equals(p3)); // true System.out.println(p2.equals(p3)); // false } }
История
- Java 14 JEP 359 , первый предварительный просмотр.
- Java 15 JEP 384 , второй предварительный просмотр.
- Java 16, стандартная функция.
Дальнейшее Чтение
16. JEEP 396: По умолчанию сильно инкапсулируйте внутренние компоненты JDK
Java 9 JEP 261 представила опцию --незаконный доступ
для управления доступом к внутренним API и пакетам JDK.
Этот JEP изменяет режим по умолчанию для параметра --незаконный доступ
с разрешения на запрет. С этим изменением внутренние пакеты и API (за исключением критических внутренних API ) JDK больше не будут открываться по умолчанию.
Мотивация этого JEP состоит в том, чтобы препятствовать сторонним библиотекам, фреймворкам и инструментам использовать внутренние API и пакеты JDK.
Дальнейшее Чтение
- JEEP 396: По умолчанию сильно инкапсулируйте внутренние компоненты JDK
- Java 17 JEP 403: Строгая инкапсуляция JDKInternals
17. JEP 397: Закрытые классы (Второй предварительный просмотр)
Java 15 JEP 360 представила закрытые классы и интерфейсы , чтобы ограничить, какой класс может их расширять или реализовывать. Этот JEP – второй предварительный просмотр с некоторыми улучшениями.
Дальнейшее Чтение
P.S Этот запечатанный класс является стандартной функцией в Ява 17 .
Скачать Исходный Код
$клон git $клон git
$cd java-16
Рекомендации
- Проект OpenJDK 16
- Исходный код OpenJDK
- Википедия – Автоматическая векторизация
- Автоматическая векторизация в Java
- Векторный процессор
- Скалярный процессор
- Особенности языка C++14
- Википедия – Доменный сокет Unix
- IntelliJ IDEA 2021.1 EAP 1: Поддержка Java 16
- OpenJDK – Что такое Метапространство
- Классы, основанные на ценности
- Классы данных и запечатанные типы для Java
- Сопоставление шаблонов для Java
- Вики–сайт OpenJDK – ZCG
- История версий Java
Оригинал: “https://mkyong.com/java/what-is-new-in-java-16/”