Рубрики
Без рубрики

Что будет в JDK 14

JDK14 должен выйти в марте 2020 года, функция, которая должна была стать частью этого выпуска, была заморожена. Список… Помеченный как java, производительность.

JDK14 должен выйти в марте 2020 года, функция, которая должна была стать частью этого выпуска, была заморожена. Список JEP, определенных для включения:

Джепс

Эти джипы можно разделить на две части с точки зрения характеристик:

Доработанный

  1. ( JEP 345 ) Распределение памяти с поддержкой NUMA для G1
  2. ( JEP 349 ) Событие JFR Потоковый
  3. ( JEP 352 ) Энергонезависимый, сопоставленный с байтовыми буферами
  4. ( JEP 358 ) Полезное исключение Nullpointerexception
  5. ( JEP 361 ) Переключать Выражения

Предварительный просмотр или инкубация

  1. ( JEP 305 ) Сопоставление с образцом, например
  2. ( ( ДЖИП 343
  3. ) Упаковочный инструмент ( JEP 359
  4. ) Записи ( JEP 368
  5. ) Текстовые блоки ( JEP 370

Материалы, которые были удалены или устарели, подпадают под

  1. ( JEP 362 ) Отказаться от портов Solaris и SPARC
  2. ( JEP 363 ) Удалить одновременную развертку меток (CMS) Сборщик мусора
  3. ( JEP 366 ) Не рекомендуется использовать комбинацию ParallelScavenge + Serialold GC
  4. ( JEP 367 ) Удалите инструменты и API Pack200

GC (сборщик мусора) до того, как JDK14 поддерживался только в Linux, он был расширен для

  1. ( ( JEP 364
  2. ) ZGC на mac OS ( JEP 365

Я буду освещать JEP, которые сначала будут завершены, а затем я также коснусь предварительного просмотра/инкубатора.

Выражения переключения (JEP 361)

Это было выпущено в качестве функции предварительного просмотра в JDK 12 и JDK13, и оно было стандартизировано (зависает) с помощью JDK14, включающего отзывы сообщества разработчиков. Существующая реализация Switch соответствует дизайну и синтаксису C и C++ и поддерживает провал.

Прежде чем говорить о выражениях switch, давайте сначала поймем недостаток существующего оператора switch:

  • Провал в поведении между метками переключения
  • Область действия по умолчанию в блоках переключения (весь блок рассматривается как одна область)
  • Довольно многословно, нелегко читать, так как в блок переключения добавляется больше “разрывов”

Этот ДЖИП внес следующие изменения

  • Новая форма метки переключения, “регистр L ->”, для обозначения того, что должен выполняться только код справа от метки. если метка совпадает

  • Если метка совпадает, то выполняется только выражение или оператор справа от стрелки; нет провала

  • Операторы Switch расширены, поэтому их можно использовать как выражение

  • Большинство выражений переключения будут иметь одно значение справа от “регистр ->”, на случай, если вам нужен блок “выход” был введен

  • В случае выражения switch требуется регистр по умолчанию, чтобы подчеркнуть, что рассматриваются все возможные случаи, регистр по умолчанию можно пропустить, если вы используете перечисление в качестве идентификатора случая, компилятор может видеть, охвачены ли все случаи или нет

Полезные исключения с нулевыми точками (JEP 358)

В этом JEP введено сообщение NPE, в котором конкретно указано, какая переменная на самом деле вызвала это исключение. Существующее сообщение журнала сообщит вам имя файла и строку, из которой был выброшен NPE, но оно не сообщит вам, какая переменная вызвала это

С помощью этого, т.е. NPE из присваивания obj.temp; может генерировать:

Исключение в потоке “основной” java.язык. Исключение NullPointerException: Невозможно назначить поле “temp”, так как “obj” равно нулю в Test.main(Тест.java:6)

Примечание:- Только NPE, созданные и созданные непосредственно JVM, будут содержать сообщение с нулевой детализацией. NPE, явно созданные и/или явно созданные программами, работающими на виртуальной виртуальной машине, не подлежат анализу байт-кода и сообщению с нулевой детализацией.

Кроме того, сообщение с нулевой детализацией не сообщается для NPE, вызванных кодом в скрытых методах, которые являются специальными низкоуровневыми методами, генерируемыми и вызываемыми JVM, например, для оптимизации конкатенации строк. У скрытого метода нет имени файла или номера строки, которые могли бы помочь точно определить источник NPE, поэтому печать сообщения с нулевой детализацией была бы бесполезной.

Эта функция не включена по умолчанию, ее можно включить с помощью опции командной строки –XX:+Показывать Детали Кода В Сообщениях Об Исключениях . Он не включен по умолчанию, потому что:

  1. Производительность – Алгоритм добавляет некоторые накладные расходы при создании трассировки стека
  2. Подробное сообщение о безопасности содержит информацию о понимании исходного кода, возможно, вам это не понадобится для производственных приложений
  3. Совместимость – Возможно, какой-то инструмент вышел из строя из-за этого нового формата сообщений

Флаг функции может не потребоваться для будущих выпусков JDK

Вычисление подробного сообщения NPE может не работать в приведенном ниже сценарии

  • При выполнении удаленного кода через RMI
  • Если инструкции байт-кода метода изменяются во время выполнения программы, например, из-за переопределения метода агентом Java, использующим JVMTI

Энергонезависимый, сопоставленный с байтовыми буферами (JEP 352)

Основная цель – позволяет программе java эффективно и согласованно обновлять NVM (энергонезависимую память) из программы java. Целевыми комбинациями платформ ОС/ЦП для этого JEP являются Linux/x64 и Linux/AArch64. Это ограничение вводится по двум причинам. Эта функция будет работать только в операционных системах, поддерживающих флаг системного вызова mmap MAP_SYNC, который позволяет синхронно отображать энергонезависимую память. Это относится и к последним выпускам Linux. Он также будет работать только на процессорах, поддерживающих обратную запись строки кэша под контролем пользовательского пространства. x64 и AArch64 предоставляют инструкции, соответствующие этому требованию.

Примечание – Последние версии Windows/X64 поддерживают флаг mmap MAP_SYNC, однако на данный момент он не поддерживается этим приложением.

NVM предоставляет возможность прикладным программистам создавать и обновлять состояние программы во время выполнения программы без значительных затрат на копирование и/или перевод, которые обычно подразумевают вывод на постоянный носитель и ввод с него. Это особенно важно для транзакционных программ, где для обеспечения аварийного восстановления требуется регулярное сохранение состояния сомнения.

Распределение памяти с поддержкой NUMA для G1 (JEP 345)

Современные машины с несколькими сокетами все чаще имеют неравномерный доступ к памяти (NUMA), то есть память не равноудалена от каждого сокета или ядра. Доступ к памяти между сокетами имеет разные характеристики производительности, при этом доступ к более удаленным сокетам обычно имеет большую задержку.

В частности, крупные корпоративные приложения, как правило, работают с большими конфигурациями кучи на нескольких сокетах, но они хотят получить преимущество в управляемости при запуске в рамках одной виртуальной виртуальной машины.

Куча G1 организована как набор областей фиксированного размера. Регион, как правило, представляет собой набор физических страниц, хотя при использовании больших страниц (через -XX:+Целевые страницы) несколько регионов могут составлять одну физическую страницу.

Если указана опция +XX:+UseNUMA, то при инициализации JVM регионы будут равномерно распределены по общему числу доступных узлов NUMA.

Потоковая передача событий JFR (JEP 349)

Чтобы использовать данные сегодня, пользователь должен запустить запись, остановить ее, сбросить содержимое на диск, а затем проанализировать файл записи. Это хорошо работает для профилирования приложений, где обычно одновременно записывается не менее минуты данных, но не для целей мониторинга. Примером использования мониторинга является панель мониторинга, которая отображает динамические обновления данных.

В рамках этого JEP был введен API, который может асинхронно публиковать событие для всех подписчиков, что значительно снижает накладные расходы.

Сопоставление шаблона с экземпляром(JEP 305)

Все Java-программисты знакомы с идиомой instanceof-и-приведения:

private static void instanceOfExist(Object obj){  
  if(obj instanceof String){
        String s =(String)obj;
        //use s
    }
}  

Это немного странное событие после тестирования типа экземпляра, в котором вы выполняете явное приведение и назначение, что не является оптимальным, этот JEP был реализован для решения этой проблемы с помощью сопоставления с образцом.

После этого JEP приведенный выше код может быть написан следующим образом:

private static void newInstanceOf(String str){
    if(str instanceof String s){
        // can use s here
    }else{
        // can't use s here
    }
}

Оператор instanceof “сопоставляет” целевой объект с шаблоном проверки типа следующим образом: если объект является экземпляром строки, то он преобразуется в строку и присваивается переменной привязки s. Переменная привязки находится в области блока true, а не в блоке false оператора if.

Упаковочный инструмент (JEP 343)

Для запуска java-приложения обычно нам требуется JVM для установки и запуска на компьютере. Этот проект был нацелен на создание упаковочного инструмента, который может генерировать двоичные файлы в собственном формате. Эти форматы включают msi и exe в Windows, pkg и dmg в mac OS, а также deb и rpm в Linux.

Для этого инструмента нет графического интерфейса, он поддерживается только как интерфейс командной строки.

Инструмент упаковки будет зависеть от платформы, т.е. для создания двоичного файла (exe) для Windows вам необходимо запустить инструмент упаковки только в Windows.

Разработчики могут использовать jlink, чтобы сократить JDK до минимального набора необходимых модулей, а затем использовать инструмент упаковки для создания сжатого, устанавливаемого образа, который можно развернуть на целевых машинах.

Образ приложения содержит как файлы, составляющие ваше приложение, так и образ среды выполнения JDK, который будет запускать ваше приложение.

  • Немодульные приложения

Предположим, у вас есть приложение, состоящее из файлов JAR, все в каталоге с именем lib, и это lib/main.jar содержит основной класс. Затем команда

$ jpackage — имя моего приложения — библиотека ввода — главная-jar main.jar

упакует приложение в формате локальной системы по умолчанию, оставив полученный файл пакета в текущем каталоге.

  • Модульные Приложения

Если у вас есть модульное приложение, состоящее из модульных файлов JAR и/или файлов JMOD в каталоге lib, с основным классом в модуле myapp, то команда

$ jpackage — имя моего приложения — модуль-путь к библиотеке -m myapp

Записи (JEP 359)

В корпоративном приложении мы создаем множество классов в качестве носителей данных. Чтобы написать правильный носитель данных, разработчику необходимо написать много кода, т.е. конструкторы(), toString(), хэш-код(), равно() и т.д. который повторяем и подвержен ошибкам, даже я часто замечаю, что разработчики пропускают эти методы, что приводит к проблемам с производством.

Большинство идей в наши дни помогают генерировать такой код, но читатель все еще не может распознать, какой класс написан разработчиком как чистое намерение носителя данных.

Это приложение было разработано с намерением, чтобы оно было простым, понятным и кратким для объявления неглубоко неизменяемых, хорошо управляемых агрегатов номинальных данных.

Записи – это новый вид объявления типов в языке Java. Как и перечисление, запись является ограниченной формой класса. Запись содержит просто имя и описание состояния. например:

точка записи(int x, int y) { }

Запись автоматически получает множество стандартных функций:

  • Частное конечное поле для каждого компонента описания состояния
  • Общедоступный метод доступа для чтения для каждого компонента описания состояния с тем же именем и типом, что и у компонента
  • Открытый конструктор, подпись которого совпадает с описанием состояния, который инициализирует каждое поле из соответствующего аргумента
  • Реализации equals и хэш-кода, которые говорят, что две записи равны, если они одного типа и содержат одно и то же состояние; и
  • Реализация toString, которая включает строковое представление всех компонентов записи с их именами

Примечание- Любой из элементов, которые автоматически выводятся из описания состояния, также может быть объявлен явно. Однако небрежное внедрение методов доступа или равенства/хэш-кода может привести к нарушению семантических инвариантов записей.

Аналогичная функциональность существует в других языках OO, основанных на JVM, т.е. классах данных в Kotlin и классах case в Scala.

### Ограничение записей

  • Невозможно расширить другой класс
  • Невозможно объявить поле экземпляра, отличное от закрытого, окончательное, другое объявленное поле должно быть статическим
  • Записи являются неявно окончательными и не могут быть абстрактными

Текстовые блоки (JEP 368)

Первоначально он был представлен в JDK 13 в качестве функции предварительного просмотра, он был повторно представлен в JDK14 с некоторыми изменениями.

Текстовый блок представляет собой многострочный строковый литерал, который устраняет необходимость в большинстве escape-последовательностей, автоматически форматирует строку предсказуемым образом и при желании предоставляет разработчику контроль над форматом.

Вы когда-нибудь вставляли фрагмент HTML, XML, SQL или JSON в строку, вам нравится, что все экранирующие и новые последовательности строк должны быть добавлены?

Вот как мы пишем сегодня:

String html = "\n" +
" \n" +
" 

Hello, world

\n" + " \n" + "\n";

После этого JEP мы можем написать так же, как

String html = """


Hello, world

""";

Текстовые блоки напрямую не поддерживают интерполяцию строк. Интерполяция может быть рассмотрена в будущем исследовании.

API доступа к внешней памяти (JEP 370)

Внедрите API для безопасного и эффективного доступа к памяти за пределами кучи Java. Многие существующие библиотеки java обращаются к внешней памяти; они работают с кэшем, т.е. memcached .

Вводит три основные абстракции:

  • Сегмент памяти используется для моделирования непрерывной области памяти с заданными пространственными и временными границами
  • Адрес памяти можно рассматривать как смещение внутри сегмента
  • Расположение памяти – это программное описание содержимого сегмента памяти

Отказаться от портов Solaris и SPARC (JEP 362)

Отказаться от портов Solaris/SPARC, Solaris/x64 и Linux/SPARC с намерением удалить их в будущей версии

Удалить одновременную развертку меток (CMS) Сборщик мусора (JEP 363)

Более 2 лет CMS была помечена как устаревшая, она была удалена из JDK14 с помощью этого JEP. G1 – сборщик мусора по умолчанию с JDK 14.

Отказаться от комбинации ParallelScavenge + Serialold GC (JEP 366)

Существует одна комбинация алгоритмов GC, которая редко используется в производственных приложениях, но требует значительных усилий по техническому обслуживанию: сопряжение параллельного GC молодого поколения (называемого ParallelScavenge) и последовательного старого GC (называемого Serialold).

Поскольку эта комбинация устарела, при попытке ее использования будет выведено предупреждение.

В будущем, в зависимости от сообщества, он может быть отменен или удален из JDK.

Удалить инструменты и API Pack200 (JEP 367)

Этот JEP предназначен для удаления инструментов pack200 и unpack200 вместе с API pack200. Они были помечены как устаревшие в JDK 11.

Оригинал: “https://dev.to/imagarg/what-s-coming-in-jdk-14-10bp”